3
3
#
4
4
# Author:Lee
5
5
6
- class Node ():
7
- '''链表结构的Node节点'''
8
6
9
- def __init__ (self , data , next = None ):
10
- '''Node节点的初始化方法.
7
+ class Node (object ):
8
+ """链表结构的Node节点"""
9
+
10
+ def __init__ (self , data , next_node = None ):
11
+ """Node节点的初始化方法.
11
12
参数:
12
13
data:存储的数据
13
14
next:下一个Node节点的引用地址
14
- '''
15
+ """
15
16
self .__data = data
16
- self .__next = next
17
+ self .__next = next_node
17
18
18
19
@property
19
20
def data (self ):
20
- ''' Node节点存储数据的获取.
21
+ """ Node节点存储数据的获取.
21
22
返回:
22
23
当前Node节点存储的数据
23
- '''
24
+ """
24
25
return self .__data
25
26
26
27
@data .setter
27
28
def data (self , data ):
28
- ''' Node节点存储数据的设置方法.
29
+ """ Node节点存储数据的设置方法.
29
30
参数:
30
31
data:新的存储数据
31
- '''
32
+ """
32
33
self .__data = data
33
34
34
35
@property
35
- def next (self ):
36
- ''' 获取Node节点的next指针值.
36
+ def next_node (self ):
37
+ """ 获取Node节点的next指针值.
37
38
返回:
38
39
next指针数据
39
- '''
40
+ """
40
41
return self .__next
41
42
42
- @next .setter
43
- def next (self , next ):
44
- ''' Node节点next指针的修改方法.
43
+ @next_node .setter
44
+ def next_node (self , next_node ):
45
+ """ Node节点next指针的修改方法.
45
46
参数:
46
47
next:新的下一个Node节点的引用
47
- '''
48
- self .__next = next
48
+ """
49
+ self .__next = next_node
49
50
50
51
51
- class SinglyLinkedList ():
52
- ''' 单向链表'''
52
+ class SinglyLinkedList (object ):
53
+ """ 单向链表"""
53
54
54
55
def __init__ (self ):
55
- ''' 单向列表的初始化方法.'''
56
+ """ 单向列表的初始化方法."""
56
57
self .__head = None
57
58
58
59
def find_by_value (self , value ):
59
- ''' 按照数据值在单向列表中查找.
60
+ """ 按照数据值在单向列表中查找.
60
61
参数:
61
62
value:查找的数据
62
63
返回:
63
64
Node
64
- '''
65
+ """
65
66
node = self .__head
66
- if node != None and node .data != value :
67
- node = node .next
68
- else :
69
- return node
67
+ while (node is not None ) and (node .data != value ):
68
+ node = node .next_node
69
+ return node
70
70
71
71
def find_by_index (self , index ):
72
- ''' 按照索引值在列表中查找.
72
+ """ 按照索引值在列表中查找.
73
73
参数:
74
74
index:索引值
75
75
返回:
76
76
Node
77
- '''
77
+ """
78
78
node = self .__head
79
79
pos = 0
80
- while node != None and pos != index :
81
- node = node .next
80
+ while ( node is not None ) and ( pos != index ) :
81
+ node = node .next_node
82
82
pos += 1
83
83
return node
84
84
85
85
def insert_to_head (self , value ):
86
- ''' 在链表的头部插入一个存储value数值的Node节点.
86
+ """ 在链表的头部插入一个存储value数值的Node节点.
87
87
参数:
88
88
value:将要存储的数据
89
- '''
89
+ """
90
90
node = Node (value )
91
- node .next = self .__head
91
+ node .next_node = self .__head
92
92
self .__head = node
93
93
94
94
def insert_after (self , node , value ):
95
- ''' 在链表的某个指定Node节点之后插入一个存储value数据的Node节点.
95
+ """ 在链表的某个指定Node节点之后插入一个存储value数据的Node节点.
96
96
参数:
97
97
node:指定的一个Node节点
98
98
value:将要存储在新Node节点中的数据
99
- '''
100
- if node == None : # 如果指定在一个空节点之后插入数据节点,则什么都不做
99
+ """
100
+ if node is None : # 如果指定在一个空节点之后插入数据节点,则什么都不做
101
101
return
102
102
103
103
new_node = Node (value )
104
- new_node .next = node .next
104
+ new_node .next_node = node .next
105
105
node .next = new_node
106
106
107
107
def insert_before (self , node , value ):
108
- ''' 在链表的某个指定Node节点之前插入一个存储value数据的Node节点.
108
+ """ 在链表的某个指定Node节点之前插入一个存储value数据的Node节点.
109
109
参数:
110
110
node:指定的一个Node节点
111
111
value:将要存储在新的Node节点中的数据
112
- '''
113
- if node == None or self .__head == None : # 如果指定在一个空节点之前或者空链表之前插入数据节点,则什么都不做
112
+ """
113
+ if ( node is None ) or ( self .__head is None ) : # 如果指定在一个空节点之前或者空链表之前插入数据节点,则什么都不做
114
114
return
115
115
116
116
if node == self .__head : # 如果是在链表头之前插入数据节点,则直接插入
@@ -120,164 +120,164 @@ def insert_before(self, node, value):
120
120
new_node = Node (value )
121
121
pro = self .__head
122
122
not_found = False # 如果在整个链表中都没有找到指定插入的Node节点,则该标记量设置为True
123
- while pro .next != node : # 寻找指定Node之前的一个Node
124
- if pro .next == None : # 如果已经到了链表的最后一个节点,则表明该链表中没有找到指定插入的Node节点
123
+ while pro .next_node != node : # 寻找指定Node之前的一个Node
124
+ if pro .next_node is None : # 如果已经到了链表的最后一个节点,则表明该链表中没有找到指定插入的Node节点
125
125
not_found = True
126
126
break
127
127
else :
128
- pro = pro .next
129
- if not_found == False :
130
- pro .next = new_node
131
- new_node .next = node
128
+ pro = pro .next_node
129
+ if not not_found :
130
+ pro .next_node = new_node
131
+ new_node .next_node = node
132
132
133
133
def delete_by_node (self , node ):
134
- ''' 在链表中删除指定Node的节点.
134
+ """ 在链表中删除指定Node的节点.
135
135
参数:
136
136
node:指定的Node节点
137
- '''
138
- if self .__head == None : # 如果链表是空的,则什么都不做
137
+ """
138
+ if self .__head is None : # 如果链表是空的,则什么都不做
139
139
return
140
140
141
141
if node == self .__head : # 如果指定删除的Node节点是链表的头节点
142
- self .__head = node .next
142
+ self .__head = node .next_node
143
143
return
144
144
145
145
pro = self .__head
146
146
not_found = False # 如果在整个链表中都没有找到指定删除的Node节点,则该标记量设置为True
147
- while pro .next != node :
148
- if pro .next == None : # 如果已经到链表的最后一个节点,则表明该链表中没有找到指定删除的Node节点
147
+ while pro .next_node != node :
148
+ if pro .next_node is None : # 如果已经到链表的最后一个节点,则表明该链表中没有找到指定删除的Node节点
149
149
not_found = True
150
150
break
151
151
else :
152
- pro = pro .next
153
- if not_found == False :
154
- pro .next = node .next
152
+ pro = pro .next_node
153
+ if not not_found :
154
+ pro .next_node = node .next_node
155
155
156
156
def delete_by_value (self , value ):
157
- ''' 在链表中删除指定存储数据的Node节点.
157
+ """ 在链表中删除指定存储数据的Node节点.
158
158
参数:
159
159
value:指定的存储数据
160
- '''
161
- if self .__head == None : # 如果链表是空的,则什么都不做
160
+ """
161
+ if self .__head is None : # 如果链表是空的,则什么都不做
162
162
return
163
163
164
164
if self .__head .data == value : # 如果链表的头Node节点就是指定删除的Node节点
165
- self .__head = self .__head .next
165
+ self .__head = self .__head .next_node
166
166
167
167
pro = self .__head
168
- node = self .__head .next
168
+ node = self .__head .next_node
169
169
not_found = False
170
170
while node .data != value :
171
- if node .next == None : # 如果已经到链表的最后一个节点,则表明该链表中没有找到执行Value值的Node节点
171
+ if node .next_node is None : # 如果已经到链表的最后一个节点,则表明该链表中没有找到执行Value值的Node节点
172
172
not_found = True
173
173
break
174
174
else :
175
175
pro = node
176
- node = node .next
177
- if not_found == False :
178
- pro .next = node .next
176
+ node = node .next_node
177
+ if not_found is False :
178
+ pro .next_node = node .next_node
179
179
180
- def delete_last_N_node (self , n ):
181
- ''' 删除链表中倒数第N个节点.
180
+ def delete_last_n_node (self , n ):
181
+ """ 删除链表中倒数第N个节点.
182
182
主体思路:
183
183
设置快、慢两个指针,快指针先行,慢指针不动;当快指针跨了N步以后,快、慢指针同时往链表尾部移动,
184
184
当快指针到达链表尾部的时候,慢指针所指向的就是链表的倒数第N个节点
185
185
参数:
186
186
n:需要删除的倒数第N个序数
187
- '''
187
+ """
188
188
fast = self .__head
189
189
slow = self .__head
190
190
step = 0
191
191
192
192
while step <= n :
193
- fast = fast .next
193
+ fast = fast .next_node
194
194
step += 1
195
195
196
- while fast .next != None :
196
+ while fast .next_node is not None :
197
197
tmp = slow
198
- fast = fast .next
199
- slow = slow .next
198
+ fast = fast .next_node
199
+ slow = slow .next_node
200
200
201
- tmp .next = slow .next
201
+ tmp .next_node = slow .next_node
202
202
203
203
def find_mid_node (self ):
204
- ''' 查找链表中的中间节点.
204
+ """ 查找链表中的中间节点.
205
205
主体思想:
206
206
设置快、慢两种指针,快指针每次跨两步,慢指针每次跨一步,则当快指针到达链表尾部的时候,慢指针指向链表的中间节点
207
207
返回:
208
208
node:链表的中间节点
209
- '''
209
+ """
210
210
fast = self .__head
211
211
slow = self .__head
212
212
213
- while fast .next != None :
214
- fast = fast .next . next
215
- slow = slow .next
213
+ while fast .next_node is not None :
214
+ fast = fast .next_node . next_node
215
+ slow = slow .next_node
216
216
217
217
return slow
218
218
219
219
def create_node (self , value ):
220
- ''' 创建一个存储value值的Node节点.
220
+ """ 创建一个存储value值的Node节点.
221
221
参数:
222
222
value:将要存储在Node节点中的数据
223
223
返回:
224
224
一个新的Node节点
225
- '''
225
+ """
226
226
return Node (value )
227
227
228
228
def print_all (self ):
229
- ''' 打印当前链表所有节点数据.'''
229
+ """ 打印当前链表所有节点数据."""
230
230
pos = self .__head
231
- if pos == None :
232
- print (' 当前链表还没有数据' )
231
+ if pos is None :
232
+ print (" 当前链表还没有数据" )
233
233
return
234
- while pos .next != None :
235
- print (str (pos .data ) + ' --> ' , end = '' )
236
- pos = pos .next
234
+ while pos .next_node is not None :
235
+ print (str (pos .data ) + " --> " , end = "" )
236
+ pos = pos .next_node
237
237
print (str (pos .data ))
238
238
239
239
def reversed_self (self ):
240
- ''' 翻转链表自身.'''
241
- if self .__head == None or self .__head .next == None : # 如果链表为空,或者链表只有一个节点
240
+ """ 翻转链表自身."""
241
+ if self .__head is None or self .__head .next is None : # 如果链表为空,或者链表只有一个节点
242
242
return
243
243
244
244
pre = self .__head
245
245
node = self .__head .next
246
- while node != None :
246
+ while node is not None :
247
247
pre , node = self .__reversed_with_two_node (pre , node )
248
248
249
249
self .__head .next = None
250
250
self .__head = pre
251
251
252
252
def __reversed_with_two_node (self , pre , node ):
253
- ''' 翻转相邻两个节点.
253
+ """ 翻转相邻两个节点.
254
254
参数:
255
255
pre:前一个节点
256
256
node:当前节点
257
257
返回:
258
258
(pre,node):下一个相邻节点的元组
259
- '''
260
- tmp = node .next
261
- node .next = pre
259
+ """
260
+ tmp = node .next_node
261
+ node .next_node = pre
262
262
pre = node # 这样写有点啰嗦,但是能让人更能看明白
263
263
node = tmp
264
- return ( pre , node )
264
+ return pre , node
265
265
266
266
def has_ring (self ):
267
- ''' 检查链表中是否有环.
267
+ """ 检查链表中是否有环.
268
268
主体思想:
269
269
设置快、慢两种指针,快指针每次跨两步,慢指针每次跨一步,如果快指针没有与慢指针相遇而是顺利到达链表尾部
270
270
说明没有环;否则,存在环
271
271
返回:
272
272
True:有环
273
273
False:没有环
274
- '''
274
+ """
275
275
fast = self .__head
276
276
slow = self .__head
277
277
278
- while fast .next != None and fast != None :
279
- fast = fast .next
280
- slow = slow .next
278
+ while ( fast .next_node is not None ) and ( fast is not None ) :
279
+ fast = fast .next_node
280
+ slow = slow .next_node
281
281
if fast == slow :
282
282
return True
283
283
0 commit comments