# -*- coding: utf-8 -*- class Node(object): """节点""" def __init__(self, data): self.data = data self.next = None class SingleCycleLinkList(object): """单向循环链表""" def __init__(self, node=None): self.__head = node if node: node.next = node @property def is_empty(self): return self.__head is None @property def length(self): """链表长度""" # cur游标,用来移动遍历节点 cur = self.__head # count记录数量 count = 0 while cur: if cur.next is self.__head: return count + 1 count += 1 cur = cur.next return count @property def travel(self): """遍历整个链表""" # cur游标,用来移动遍历节点 cur = self.__head while cur: if cur.next == self.__head: print(cur.data) return print(cur.data, end=' ') cur = cur.next def add(self, elem): """链表头部添加元素,头插法""" node = Node(elem) if self.is_empty: self.__head = node node.next = node return node.next = self.__head cur = self.__head while cur: if cur.next == node.next: self.__head = node cur.next = node.next cur.next = node return cur = cur.next def append(self, elem): """链表尾部添加元素,尾插法""" node = Node(elem) if self.is_empty: self.__head = node node.next = node else: cur = self.__head while cur.next != self.__head: cur = cur.next node.next = cur.next cur.next = node def insert(self, pos, elem): """指定位置添加元素""" if pos == 0: self.add(elem) elif pos > (self.length-1): self.append(elem) elif pos < 0: if abs(pos) > self.length: self.add(elem) else: node = Node(elem) count = 0 cur = self.__head while cur: if (count+abs(pos)) == self.length: node.next = cur.next cur.next = node break cur = cur.next count += 1 else: node = Node(elem) count = 0 cur = self.__head while (count+1) < pos: cur = cur.next count += 1 node.next = cur.next cur.next = node def remove(self, elem): """删除节点""" if self.is_empty: return cur = self.__head count = 0 # 头节点处理 if cur.data == elem: pos = self.__head while pos.next != self.__head: pos = pos.next self.__head = cur.next pos.next = self.__head return count, elem while cur.next: # 尾节点处理 if cur.next == self.__head: if cur.next.data == elem: cur.next = cur.next.next return count + 1, elem return # 其他节点处理 else: if cur.next.data == elem: cur.next = cur.next.next return count+1, elem cur = cur.next count += 1 def is_contain(self, elem): """查找节点是否存在""" cur = self.__head while cur: if cur.next == self.__head: if cur.data == elem: return True return False else: if cur.data == elem: return True cur = cur.next return False def search(self, elem): """查找节点所在位置""" cur = self.__head count = 0 while cur: if cur.next == self.__head: if cur.data == elem: return count return else: if cur.data == elem: return count cur = cur.next count += 1 return if __name__ == '__main__': ll = SingleCycleLinkList() print(ll.is_empty) print(ll.length) print(ll.remove(1)) ll.add(0) ll.append(1) print(ll.is_empty) print(ll.length) ll.travel ll.append(2) ll.append(3) ll.append(4) ll.append(5) ll.travel ll.add(8) ll.add(9) ll.add(10) ll.travel print(ll.search(8)) print(ll.search(3)) print(ll.search(6)) print(ll.search(5)) print(ll.is_contain(8)) print(ll.is_contain(3)) print(ll.is_contain(6)) print(ll.is_contain(5)) ll.travel print(ll.remove(8)) ll.travel print(ll.remove(10)) ll.travel print(ll.remove(5)) ll.travel print(ll.remove(6)) ll.travel ll.insert(-3, 0) ll.travel ll.insert(-9, 89) ll.travel
python实现简单单向循环链表
最新推荐文章于 2022-05-23 12:10:12 发布