1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
|
@author:yzk13 @time: 2018/04/17
"""单向循环链表"""
class Node(object): """ 节点类 """ def __init__(self, value, next): self.value = value self.next = next
class SinCycLinkedList(object): def __init__(self): self.root = None
def is_empty(self): """ 判断链表是否为空 :return: """ return self.root == None
@property def length(self): """ 求链表长度 :return: """ if self.is_empty(): return 0 else: counter = 1 cursor = self.root while cursor.next != self.root: counter += 1 cursor = cursor.next return counter
def print(self): """ 打印链表 :return: """ if self.is_empty(): print('Nothing') else: cursor = self.root print('[%s' % str(cursor.value), end='') while cursor.next != self.root: cursor = cursor.next print(', ', cursor.value, end='') print(']')
def prepend(self, value): """ 在表头添加Node :return: """ node = Node(value, None) if self.is_empty(): self.root = node node.next = self.root else: node.next = self.root cursor = self.root while cursor.next != self.root: cursor = cursor.next cursor.next = node self.root = node
def append(self, value): """ 在表添加节点 :return: """ node = Node(value, None) if self.is_empty(): self.root = node node.next = self.root else: cursor = self.root while cursor.next != self.root: cursor = cursor.next cursor.next = node node.next = self.root
def insert(self, index, value): """ 在指定位置添加节点 :return: """ if index < 0 or index > self.length: print('Index错误, 索引越界') elif index == 0: self.prepend(value) else: node = Node(value, None) cursor = self.root counter = 0 while counter < index-1: counter += 1 cursor = cursor.next node.next = cursor.next cursor.next = node
def remove(self, value): """ 删除某个值的所有 :param index: :return: """ if self.is_empty(): return cur = self.root pre = None if cur.value == value: if cur.next != self.root: while cur.next != self.root: cur = cur.next cur.next = self.root.next self.root = self.root.next else: self.root = None else: pre = self.root while cur.next != self.root: if cur.value == value: pre.next = cur.next return else: pre = cur cur = cur.next if cur.value == value: pre.next = cur.next
def search(self, value): """ 查找节点是否存在 :param value: :return: """ if self.is_empty(): return False cur = self.root if cur.value == value: return True while cur.next != self.root: cur = cur.next if cur.value == value: return True return False
if __name__ == '__main__': l = SinCycLinkedList() l.print()
l.prepend(3) l.prepend(4)
l.append(5) l.append(1)
l.print()
l.insert(0, 1) l.insert(3, 7) l.print()
l.remove(2) l.print()
print('链表是否为空?: ', l.is_empty())
print('是否存在7?:', l.search(7))
print('链表长度为: ', l.length)
|