1 class Node:
2 '''
3 节点类
4 链表节点结构 data next
5 data: 节点保存的数据
6 _next: 保存下一个节点对象
7 '''
8
9 def __init__(self, data, pnext=None):
10 self.data = data
11 self._next = pnext
12
13 def __repr__(self) -> str:
14 return str(self.data)
15
16
17 class Link_list:
18 """
19 链表类:
20 属性: 1.链表头head 2.链表长度
21 方法: 1.是否为空 isEmpty 2.增加 append 3.删除节点 delete 4.修改(更新)节点 update
22 5.查找节点 getNode 6.获取节点的索引 getIndex 7.插入 insert 8.清空链表clear
23 """
24
25 def __init__(self) -> None:
26 """
27 初始化链表,head信息为空,长度为0
28 """
29 self._head = None
30 self._length = 0
31
32 def isEmpty(self):
33 """
34 判断链表是否为空
35 :return:
36 """
37 return self._length == 0
38
39 def append(self, item):
40 """
41
42 :param item: Node 或者 node的data信息
43 :return: None
44 """
45
46 if not isinstance(item, Node):
47 item = Node(data=item)
48
49 if not self._head:
50 # head为Node对象
51 # head ---> data + nextNode
52 self._head = item
53 self._length += 1
54 else:
55 # 取到第一个的Node对象
56 _node = self._head
57 # 如果不是最后一个节点则一直往下找,使用while的原因是不知道会有多少个
58 while _node._next:
59 # 得到后继为空的,也就是最后一个
60 _node = _node._next
61 # 将新的节点赋值给最后一个的_next属性
62 _node._next = item
63 self._length += 1
64
65 def insert(self, index, item):
66 if not isinstance(item, Node):
67 item = Node(data=item)
68 if not isinstance(index, int):
69 raise TypeError("index应该为int类型")
70 if index < 0 or index >= self._length:
71 print("输入的索引不正确")
72 return False
73 if index == 0:
74 # 在链表的头部进行添加
75 old_head = self._head
76 item._next = old_head
77 self._head = item
78 self._length += 1
79
80 else:
81 # 得到第一个node
82 _node = self._head
83 for i in range(index - 1):
84 # 得到插入位置的前驱
85 _node = _node._next
86 # 得到本来在指定位置的node
87 old_index_node = _node._next
88 # 给插入的node设置前驱
89 _node._next = item
90 # 给插入的元素设置后继
91 item._next = old_index_node
92 self._length += 1
93 return True
94
95 def delete(self, index):
96 """
97 根据索引删除节点
98 :param index: 索引
99 :return: bool
100 """
101 if not isinstance(index, int):
102 raise TypeError("index应该为int类型")
103 if self.isEmpty():
104 print("当前链表为空")
105 return False
106 if index < 0 or index >= self._length:
107 print("输入的索引不正确")
108 return False
109 elif index == 0:
110 self._head = self._head._next
111 self._length -= 1
112 return True
113 elif index == self._length - 1:
114 _node = self._head
115 # 如果不是最后一个节点则一直往下找
116 for i in range(index):
117 _node = _node._next
118 _node._next = None
119 self._length -= 1
120 return True
121 else:
122 _node = self._head
123 for j in range(index - 1):
124 _node = _node._next
125 _node._next = _node._next._next
126 self._length -= 1
127 return True
128
129
130
131 def pop(self,index=None):
132 """
133
134 :type int
135 :param index:
136 :return:
137 """
138 # 先判断链表是否是空的
139 if self.isEmpty():
140 print("当前链表为空")
141 return False
142 if index is None:
143 # 不指定index的时候,直接弹出最后一个
144 index = self._length-1
145 if not isinstance(index, int):
146 raise TypeError("index应该为int类型")
147 if index < 0 or index >= self._length:
148 print("输入的索引不正确")
149 return False
150 # 获取head指向的node
151 first_node = self._head
152 _node = first_node
153 for i in range(index-1):
154 # 得到第index-1个位置的node
155 _node = _node._next
156
157 if index==0:
158 self._head=first_node._next
159 self._length-=1
160 return first_node
161 else:
162 select_node = _node._next
163 _node._next= select_node._next
164 self._length-=1
165 return select_node
166
167
168
169
170
171
172
173
174 # def pop(self, index):
175 # """
176 # 根据索引删除节点,并返回
177 # :param index: 索引
178 # :return: bool
179 # """
180 # if not isinstance(index, int):
181 # raise TypeError("index应该为int类型")
182 # if self.isEmpty():
183 # print("当前链表为空")
184 # return False
185 # if index < 0 or index >= self._length:
186 # print("输入的索引不正确")
187 # return False
188 # elif index == 0:
189 # """弹出第一个node"""
190 # # 得到第0个node
191 # _node = self._head
192 # # 将head指向第二个node
193 # self._head = _node._next
194 # self._length -= 1
195 # return _node
196 # elif index == self._length - 1:
197 # """弹出最后一个node"""
198 # # 先找到head指向的node,即第0个node
199 # _node = self._head
200 # # 如果不是最后一个节点则一直往下找
201 #
202 # for i in range(index - 1):
203 # # 拿到倒数第二个node
204 # _node = _node._next
205 # end_node = _node._next
206 # # 给倒数第二个node设置新的后继,None
207 # _node._next = None
208 # self._length -= 1
209 # return end_node
210 # else:
211 # # 中间的node
212 # _node = self._head
213 # for j in range(index - 1):
214 # # 得到指定index的前驱
215 # _node = _node._next
216 # # 得到应得的node
217 # selected_node = _node._next
218 # # 将弹出的node的前驱的后继设置成要弹出的node的后继
219 # _node._next = selected_node._next
220 # self._length -= 1
221 # return selected_node
222
223 def getNode(self, index):
224 """
225 根据index得到节点
226 :type int
227 :param index: 索引
228 :type: Node
229 :return: Node对象
230 """
231 if not isinstance(index, int):
232 raise TypeError("index应该为int类型")
233 if self.isEmpty():
234 print("当前链表为空")
235 return False
236 if index < 0 or index >= self._length:
237 print("输入的索引不正确")
238 return False
239 # 得到第0个node
240 _node = self._head
241 for i in range(index):
242 _node = _node._next
243 return _node
244
245 def update(self, index, data):
246 """
247 更新节点
248 :param index: 索引
249 :param data: 节点信息
250 :return: 返回修改后的节点
251 """
252 if not isinstance(index, int):
253 raise TypeError("index应该为int类型")
254 if self.isEmpty():
255 print("当前链表为空")
256 return False
257 if index < 0 or index >= self._length:
258 print("输入的索引不正确")
259 return False
260 _node = self._head
261 for i in range(index):
262 _node = _node._next
263 _node.data = data
264 return _node
265
266 def getIndex(self, node):
267 """
268 根据节点得到节点索引
269 :param node:节点
270 :return:index
271 """
272 if isinstance(node, Node):
273 for i in range(self._length):
274 if node is self.getNode(i):
275 return i
276 print("node异常")
277 return
278 else:
279 raise TypeError("类型不正确")
280
281 def clear(self):
282 self.head = None
283 self._length = 0
284 return True
285
286 def printl(self):
287 for i in range(self._length):
288 print(self.getNode(i))