1. 程式人生 > 其它 >Python實現迴圈單鏈表

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()