2
2
# -*- coding:utf-8 -*-
3
3
4
4
"""
5
- 实现一个带哨兵的双向循环链表。一个哨兵是一个空对象,在双向链表实现中简化了改变链接的时候需要判断None的情况。
5
+ 实现一个带哨兵的双向循环链表。一个哨兵是一个空对象
6
+ 在双向链表实现中简化了改变链接的时候需要判断None的情况。
6
7
实现这个链表的过程时刻记得更新插入和删除节点的前后节点的指针
7
8
"""
8
9
from __builtin__ import object
@@ -12,87 +13,92 @@ class LinkedList(object):
12
13
class Node (object ):
13
14
"""docstring for LinkedList.Node"""
14
15
15
- def __init__ (self ,key ,prev ,next ):
16
+ def __init__ (self ,value ,prev ,next_node ):
16
17
super (LinkedList .Node ,self ).__init__ ()
17
- self .key = key
18
+ self .value = value
18
19
self .prev = prev
19
- self .next = next
20
+ self .next_node = next_node
20
21
21
22
def __str__ (self ):
22
- return str (self .key )
23
+ return str (self .value )
23
24
24
25
def __init__ (self ,* arg ):
26
+ """
27
+ 创建一个链表
28
+ :param arg: 可变参数,是列表的初始元素
29
+ :return:
30
+ """
25
31
super (LinkedList ,self ).__init__ ()
32
+ # dump对象的prev指针始终指向列表的尾巴
33
+ # 而列表的最后一个元素的next指针则始终指向列表开头,整个列表就是一个环
26
34
self .__dump = LinkedList .Node (None ,None ,None )
27
35
self .__dump .prev = self .__dump
28
- self .__dump .next = self .__dump
36
+ self .__dump .next_node = self .__dump
29
37
self .__length = 0
30
- for key in arg :
31
- self .append (key )
38
+ for value in arg :
39
+ self .append (value )
32
40
33
41
def insert (self ,index ,value ):
34
42
if index > self .__length :
35
43
raise IndexError ("can not insert beyond the list" )
44
+
36
45
cur_pos = 0
37
46
cur_node = self .__dump
38
47
while cur_pos < index :
39
- cur_node = cur_node .next
48
+ cur_node = cur_node .next_node
40
49
cur_pos += 1
50
+
41
51
prev_node = cur_node .prev
42
52
node = LinkedList .Node (value ,prev_node ,cur_node )
43
53
cur_node .prev = node
44
- prev_node .next = node
54
+ prev_node .next_node = node
45
55
self .__length += 1
46
56
return node
47
57
48
58
def append (self ,value ):
49
59
last_node = self .__dump .prev
50
60
node = LinkedList .Node (value ,last_node ,self .__dump )
51
61
# 现在结尾的节点指向新加的结尾点
52
- last_node .next = node
62
+ last_node .next_node = node
53
63
self .__dump .prev = node
54
64
self .__length += 1
55
- # 处理空链表的情况
56
- if self .__dump .next is self .__dump :
57
- self .__dump .next = node
58
65
return node
59
66
60
67
def prepend (self ,value ):
61
- node = LinkedList .Node (value ,self .__dump ,self .__dump .next )
62
- self .__dump .next = node
63
- self .__dump .next .prev = node
64
- # 处理空链表的情况
65
- if self .__dump .prev is self .__dump :
66
- self .__dump .prev = node
68
+ node = LinkedList .Node (value ,self .__dump ,self .__dump .next_node )
69
+ self .__dump .next_node .prev = node
70
+ self .__dump .next_node = node
67
71
self .__length += 1
68
72
return node
69
73
70
74
def search (self ,value ):
71
- cur_node = self .__dump .next
72
- while cur_node is not self .__dump and cur_node .key != value :
73
- cur_node = cur_node .next
74
- return cur_node .key
75
+ cur_node = self .__dump .next_node
76
+ while cur_node is not self .__dump and cur_node .value != value :
77
+ cur_node = cur_node .next_node
78
+ return cur_node .value
75
79
76
80
def delete (self ,value ):
77
- cur_node = self .__dump .next
78
- while cur_node is not self .__dump and cur_node .key != value :
79
- cur_node = cur_node .next
81
+ cur_node = self .__dump .next_node
82
+ while cur_node is not self .__dump and cur_node .value != value :
83
+ cur_node = cur_node .next_node
84
+
80
85
# 如果不是空链表,那么就是查找到了相应的元素
81
86
if cur_node is not self .__dump :
82
- cur_node .prev .next = cur_node .next
83
- cur_node .next .prev = cur_node .prev
87
+ cur_node .prev .next_node = cur_node .next_node
88
+ cur_node .next_node .prev = cur_node .prev
89
+ self .__length -= 1
84
90
85
- return cur_node .key
91
+ return cur_node .value
86
92
87
93
def __len__ (self ):
88
94
return self .__length
89
95
90
96
def __str__ (self ):
91
- cur_node = self .__dump .next
97
+ cur_node = self .__dump .next_node
92
98
li = []
93
99
while cur_node is not self .__dump :
94
100
li .append (str (cur_node ))
95
- cur_node = cur_node .next
101
+ cur_node = cur_node .next_node
96
102
return '[' + ", " .join (li )+ ']'
97
103
98
104
@@ -103,10 +109,20 @@ def main():
103
109
li .delete (5050 )
104
110
print li
105
111
li = LinkedList ()
106
- for x in xrange (1 ,10 ):
112
+ for x in range (1 ,10 ):
107
113
li .insert (0 ,x )
108
114
print li
109
115
116
+ li = LinkedList ()
117
+ for x in range (1 ,10 ):
118
+ li .append (x )
119
+ print li
120
+
121
+ li = LinkedList ()
122
+ for x in range (1 ,10 ):
123
+ li .prepend (x )
124
+ print li
125
+
110
126
111
127
if __name__ == '__main__' :
112
128
main ()