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