Fork me on GitHub

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

 

posted @ 2022-02-18 14:12  wangkx  阅读(181)  评论(0编辑  收藏  举报