class Node(object): """构造节点""" def __init__(self,item): self.elem = item self.next = None class SingleCycleLinkList(object): """单向循环链表""" def __init__(self,item=None): """构造一个单向循环链表""" if item == None: node = None else: node = Node(item) node.next = node self.__head = node def is_empty(self): """判空""" return self.__head == None def length(self): """返回链表的长度""" if self.__head == None: return 0 cur = self.__head count = 1 while cur.next != self.__head: count += 1 cur = cur.next return count def travel(self): """遍历链表""" if self.__head == None: pass else: cur = self.__head while cur.next != self.__head: print(cur.elem,end=" ") cur = cur.next #最后一个元素未打印 print(cur.elem) def append(self,item): """从尾部添加元素""" #必须要遍历 node = Node(item) cur = self.__head if cur == None: self.__head = node node.next = self.__head else: while cur.next != self.__head: cur = cur.next node.next = self.__head cur.next = node def add(self,item): """从链表头部添加元素""" node = Node(item) if self.__head == None: self.__head = node node.next = self.__head #因为python的变量起到地址的作用,所以原链表最后一cur.next的指向,并不会随self.head的改变而改变 else: cur = self.__head while cur.next != self.__head: cur = cur.next node.next = self.__head self.__head = node cur.next = self.__head def inssert(self,item,loc): """在链表的任意位置添加元素""" #loc为添加位置(从0开始索引) node = Node(item) if loc == 0: self.add(item) elif loc > self.length() or loc < 0: print("errpr: single link list is not length") else: cur = self.__head count = 0 while count < (loc - 1):#定位到插入位置的前一个 count += 1 cur = cur.next node.next = cur.next#把插入位置的节点指给构造的node的next cur.next = node#把前一个的next只给node #注:尾部插入无特殊情况 def search(self,loc): """查找节点(索引),返回节点的元素""" if loc >= self.length() or loc < 0: return "errpr: single link list is not length" else: sur = self.__head count = 0 while count < loc: count += 1 sur = sur.next return sur.elem def remove(self,loc): """删除元素""" #loc为索引位置(从0开始索引) if loc >= self.length() or loc < 0: return "errpr: single link list is not length" else: pre = self.__head if loc == 0:#删除第一个 if self.length() == 1:#只有一个元素 remove_elem = self.__head.elem self.__head = None else: remove_elem = self.__head.elem while pre.next != self.__head: pre = pre.next pre.next = self.__head.next self.__head = pre.next else: count = 0 while count != (loc-1): count += 1 pre = pre.next remove_elem = pre.next.elem pre.next = pre.next.next return remove_elem if __name__ == "__main__": sll = SingleCycleLinkList(2) sll.append(3) sll.append(4) sll.append(5) sll.add(1) sll.inssert(7,2) print(sll.is_empty()) print(sll.length()) sll.travel() print(sll.search(1)) print(sll.remove(0)) sll.travel()
09-13