Python实现循环单链表
1 ''' 2 创建一个节点类 3 ''' 4 5 6 class Node: 7 def __init__(self, data): 8 self.data = data 9 self.next = None 10 11 12 ''' 13 定义一个循环单链表 14 ''' 15 16 17 class CycleLink: 18 def __init__(self): 19 self.header = None 20 self.length = 0 21 22 # 判断链表是否为空 23 def is_empty(self): 24 return not self.header 25 26 ''' 27 实现向链表添加数据的功能 28 有三种实现方式: 29 1.头插法 30 2.尾插法 31 3.根据指定位置向单链表插入元素 32 ''' 33 34 # 1.头插法 35 def __add__(self, value): 36 node = Node(value) 37 if self.is_empty(): 38 self.header = node 39 node.next = self.header 40 self.length += 1 41 return 42 cur = self.header 43 while cur.next != self.header: 44 cur = cur.next 45 cur.next = node 46 node.next = self.header 47 self.header = node 48 self.length += 1 49 50 # 2.尾插法 51 def append(self, value): 52 node = Node(value) 53 cur = self.header 54 if self.is_empty(): 55 self.__add__(value) 56 return 57 while cur.next != self.header: 58 cur = cur.next 59 cur.next = node 60 node.next = self.header 61 self.length += 1 62 63 # 3.根据指定位置向单链表插入元素 64 def insert(self, index, value): 65 if index <= 1: 66 self.__add__(value) 67 elif index > self.length - 1: 68 self.append(value) 69 else: 70 cur = self.header 71 node = Node(value) 72 temp = 1 73 while temp != index - 1: 74 cur = cur.next 75 temp += 1 76 node.next = cur.next 77 cur.next = node 78 self.length += 1 79 return value 80 81 ''' 82 实现查询循环链表的功能 83 有三种实现方式: 84 1.根据索引查询单链表的对应元素 85 2.直接查询元素 86 3.遍历整个单链表,并打印出所有元素 87 ''' 88 89 # 1.根据索引查询单链表的对应元素 90 def __getitem__(self, index): 91 if index < 0 or index > self.length: 92 raise IndexError 93 cur = self.header 94 for i in range(index - 1): 95 cur = cur.next 96 return cur.data 97 98 # 2.直接查询元素,并返回元素的索引 99 def is_Exist(self, value): 100 if self.is_empty(): 101 return -1 102 temp = 0 103 cur = self.header 104 while cur.next != self.header: 105 if cur.data == value: 106 return temp + 1 107 cur = cur.next 108 temp += 1 109 if cur.data == value: 110 return temp + 1 111 return -1 112 113 # 3.遍历整个单链表,并打印出所有元素 114 def getAll(self): 115 if self.is_empty(): 116 print('目前链表中没有元素!') 117 return 118 cur = self.header 119 while cur.next is not self.header: 120 print('%d' % cur.data, end=' ') 121 cur = cur.next 122 print('%d' % cur.data, end=' ') 123 124 ''' 125 实现修改元素的功能 126 ''' 127 128 def __setitem__(self, index, value): 129 if index < 0 or index > self.length: 130 raise IndexError 131 cur = self.header 132 for i in range(index - 1): 133 cur = cur.next 134 cur.data = value 135 return value 136 137 ''' 138 实现删除元素的功能 139 有三种实现方式: 140 1.根据索引删除元素 141 2.直接删除元素 142 3.清空循环单链表 143 ''' 144 145 # 1.根据索引删除元素 146 def __delitem__(self, index): 147 cur = self.header 148 pre = None 149 for i in range(index - 1): 150 pre = cur 151 cur = cur.next 152 if cur == self.header: 153 pre = self.header 154 while pre.next != self.header: 155 pre = pre.next 156 pre.next = self.header.next 157 self.header = self.header.next 158 self.length -= 1 159 return ' ' 160 pre.next = cur.next 161 self.length -= 1 162 return ' ' 163 164 # 2.直接删除元素 165 def __delete__(self, value): 166 cur = self.header 167 pre = None 168 while cur.next != self.header: 169 if cur.data == value: 170 if cur == self.header: 171 pre = self.header 172 while pre.next != self.header: 173 pre = pre.next 174 pre.next = cur.next 175 self.header = cur.next 176 self.length -= 1 177 return ' ' 178 pre.next = cur.next 179 self.length -= 1 180 return ' ' 181 pre = cur 182 cur = cur.next 183 if cur.data == value: 184 pre.mext = cur.next 185 pre.next = cur.next 186 self.length -= 1 187 return ' ' 188 189 # 3.清空循环单链表 190 def clear(self): 191 self.header=None 192 193 194 195 196 if __name__ == '__main__': 197 s = CycleLink() 198 s.__add__(12) 199 s.__add__(13) 200 s.__add__(15) 201 s.append(22) 202 s.append(23) 203 s.append(25) 204 s.getAll() 205 print('\n在链表的第%d个位置插入元素%d:' % (2, s.insert(2, 44))) 206 s.getAll() 207 print('\n目前链表中元素的数量:', s.length) 208 print('查询链表第%d个位置的元素是 %d.' % (4, s.__getitem__(4))) 209 print('修改第%d个元素为%d!' % (1, s.__setitem__(1, 90))) 210 s.getAll() 211 print('删除第%d个元素' % 1, s.__delitem__(1)) 212 s.getAll() 213 print('\n目前链表中元素的数量:', s.length) 214 print('删除链表元素%d' % 22, s.__delete__(22)) 215 s.getAll() 216 print('\n目前链表中元素的数量:', s.length) 217 print('\n清空链表中的元素:') 218 s.clear() 219 s.getAll()