class Node(object): def __init__(self,elem): self.elem = elem self.next = None class SingleLinkCir(object): def __init__(self,node=None): self.__head = node if node: self.node = node #节点默认指向自己 def is_empty(self): return self.__head == None """遍历所有节点,并记录数据""" def length(self): if self.is_empty(): return 0 cur = self.__head count = 1 while cur.next != self.__head:#跳出循环条件,当当当前指针的下一指针指向头结点时证明此节点为为尾节点 cur = cur.next count += 1 return count def travel(self): cur = self.__head if self.__head == None: return None else: while cur.next != self.__head: print(cur.elem,end="") cur = cur.next print(cur.elem)#当cur等于尾节点时,退出循环,但是尾节点的元素需要打印,所以退出循环时候进行打印 def add(self,item): node = Node(item) if self.is_empty():#判断链表是否为空 self.__head = node node.next = node else: cur = self.__head while cur.next != self.__head: cur= cur.next node.next = self.__head self.__head = node cur.next = node def append(self,item): node = Node(item) #cur = self.__head if self.is_empty(): self.__head = node node.next = node else: cur = self.__head while cur.next != self.__head: cur = cur.next #cur.next = node.next node.next = self.__head cur.next = node def insert(self,pos,item): if pos <= 0: self.add(item) elif pos > (self.length()-1): self.append(item) else: node = Node(item) cur = self.__head count = 0 if is_empty(): self.__head == node node.next = node else: while count < pos: cur = cur.next count += 1 node.next = cur.next cur.next = node def search(self,item): cur = self.__head if self.is_empty(): return False while cur.elem != item: if cur.next !=self.__head: cur = cur.next else: return False return True def remove(self,item): if self.is_empty(): return cur = self.__head pre = None while cur.elem != item: if cur.next != self.__head: pre = cur cur = cur.next else: return False if cur == self.__head:#如果删除的是头结点,要找到尾节点,把尾节点的指向改为原来头结点的next if self.length() != 1:#判段链表中是否只有一个节点,只有一个节点则引入尾节点, rear_node = self.__head while rear_node.next != self.__head: rear_node = rear_node.next #pre.next = self.__head self.__head = cur.next rear_node.next = self.__head # rear.next = cur.next # self.__head= cur.next else:#只有一个节点,删除唯一节点, self.__head = None else:#删除中间节点和尾节点 pre.next = cur.next if __name__ == "__main__": ll= SingleLinkCir() print(ll.is_empty()) print(ll.length()) ll.append(1) print(ll.is_empty()) print(ll.length()) # ll.travel() print("*" * 50) ll.remove(1) ll.append(2) ll.add(8) ll.insert(3,3) ll.travel() ll.append(100) ll.travel() ll.remove(100) ll.travel() ll.remove(8) ll.travel()