class Node: """先定一个node的类""" def __init__(self, value=None, next=None): self.value = value self.next = next def getValue(self): return self.value def getNext(self): return self.next def setValue(self, new_value): self.value = new_value def setNext(self, new_next): self.next = new_next class LinkedList: """实现一个单向链表及其各类操作方法""" def __init__(self): """初始化空链表""" self._head = Node() self._tail = None self._length = 0 def isEmpty(self): """检测是否为空""" return self._head is None def add(self, value): """add在链表前端添加元素:O(1)""" newnode = Node(value) newnode.setNext(self._head) # 注意这里的顺序不能和setNext()颠倒不然新增的节点找不到next self._head = newnode def append(self, value): """append在链表尾部添加元素:O(n) 思路:遍历链表,在原链尾next指向新节点""" newnode = Node(value) if self.isEmpty(): # 若为空表,将添加的元素设为第一个元素 self._head = newnode else: # 从链首遍历链表 current = self._head while current.getNext() is not None: current = current.getNext() # 找到最后一个,直接设置它的next指向新增的节点 current.setNext(newnode) def size(self): """获取链表的元素个数 从链头head开始遍历到链尾,同时用变量累加经过的节点个数""" current = self._head while current is not None: current = current.getNext() self._length += 1 return self._length def search(self, value): """查找元素是否在链表,找到返回True,否则返回False 从链头head开始遍历到链尾,并判断当前节点的数据是否为目标value""" current = self._head found = False while current is not None and not found: if current.getValue() == value: found = True else: current = current.getNext() return found def remove(self, value): """删除一个元素 遍历链表""" current = self._head previous = None found = False while not found: if current.getValue() == value: found = True # 找到后判断value是不是链首,是的话,head为value的下个节点 if not previous: self._head = current.getNext() else: # 不是的话,将前一个节点的next指向要删除的节点的下一个节点 previous.setNext(current.getNext()) elif current.getNext() is not None: # 之前的节点指向当前节点 previous = current # 并找下一个节点作为循环的当前节点 current = current.getNext() else: raise ValueError('{} is not in LinkedList'.format(value)) def index(self, value): """返回元素在链表的位置,找不到抛出ValueError错误 遍历链表,并用count累加遍历过的每一个节点位置""" current = self._head count = 0 found = False while current is not None and not found: if current.getValue() == value: found = True else: current = current.getNext() count += 1 if found: return count else: raise ValueError('{} is not in LinkedList'.format(value)) def insert(self, position, value): """往链表position位置插入一个元素value""" # 如果是链首,直接add添加 if position <= 1: self.add(value) # 如果是链尾,直接append elif position > self.size(): self.append(value) # 中间位置插入,思路也是从头遍历,找到position位置之前一个节点插入 # 并修改previous节点next指向新节点,新节点next指向position位置的节点 else: temp = Node(value) previous = None count = 1 current = self._head while count < position: count += 1 previous = current current = current.getNext() previous.setNext(temp) temp.setNext(current) if __name__ == '__main__': link = LinkedList() link.add(4) link.add(5) link.add(6) link.add(7) print(link.remove(4)) print(link.size())