1 # -*- coding=utf-8 -*-
2 # software: 算法学习
3 # datetime:2020/4/13 12:56 下午
4
5
6 class Node(object):
7 """
8 链表的节点对象:包含数据与和指针域
9 """
10
11 def __init__(self, data=None, next=None, pre=None):
12 self._value = data
13 self._next = next
14 self._pre = pre
15
16 def get_value(self):
17 return self._value
18
19 def get_next(self):
20 return self._next
21
22 def get_pre(self):
23 return self._pre
24
25 def set_value(self, new_data):
26 self._value = new_data
27
28 def set_next(self, new_next):
29 self._next = new_next
30
31 def set_pre(self, new_data):
32 self._pre = new_data
33
34
35 class DoublyLinkedList(object):
36 """
37 双向链表
38 """
39
40 def __init__(self):
41 self._head = None
42 self._pre = None
43 self._next = Node
44 self._length = 0
45 self._tail = None
46
47 def add(self, value):
48 new_node = Node(value)
49 if self._head is None:
50 self._head = new_node
51 self._tail = new_node
52 self._length += 1
53 return
54 new_node.set_next(self._head)
55 self._head.set_pre(new_node)
56 self._head = new_node
57 self._length += 1
58
59 def size(self):
60 return self._length
61
62 def traverse(self):
63 current = self._head
64 if current is None:
65 return -1
66 s = ""
67 while current.get_next():
68 s += str(current.get_value()) + " "
69 current = current.get_next()
70 s += str(current.get_value())
71 return s
72
73 def traverse1(self):
74 current = self._tail
75 if current is None:
76 return -1
77 s = ""
78 while current.get_pre():
79 s += str(current.get_value()) + " "
80 current = current.get_pre()
81 s += str(current.get_value())
82 return s
83
84
85 class DoublyCycleLinkedList(object):
86 """
87 双向循环链表
88 """
89
90 def __init__(self):
91 self._head = None
92 self._pre = None
93 self._next = Node
94 self._length = 0
95 self._tail = None
96
97 def add(self, value):
98 new_node = Node(value)
99 if self._head is None:
100 self._head = new_node
101 self._tail = new_node
102 self._head.set_pre(self._head)
103 self._head.set_next(self._head)
104 self._length += 1
105 return
106 new_node.set_next(self._head)
107 new_node.set_pre(self._tail)
108 self._head.set_pre(new_node)
109 self._tail.set_next(new_node)
110 self._head = new_node
111 self._length += 1
112
113 def append(self, value):
114 new_node = Node(value)
115 if self._head is None:
116 self._head = new_node
117 self._tail = new_node
118 self._head.set_pre(self._head)
119 self._head.set_next(self._head)
120 self._length += 1
121 return
122 new_node.set_next(self._head)
123 new_node.set_pre(self._tail)
124 self._head.set_pre(new_node)
125 self._tail.set_next(new_node)
126 self._tail = new_node
127 self._length += 1
128
129 def size(self):
130 return self._length
131
132 def traverse(self):
133 current = self._head
134 if current is None:
135 return -1
136 tmp = self._head
137 s = ""
138 while current.get_next() != tmp:
139 s += str(current.get_value()) + " "
140 current = current.get_next()
141 s += str(current.get_value())
142 return s
143
144 def traverse1(self):
145 current = self._tail
146 if current is None:
147 return -1
148 s = ""
149 tmp = self._tail
150 while current.get_pre() != tmp:
151 s += str(current.get_value()) + " "
152 current = current.get_pre()
153 s += str(current.get_value())
154 return s
155
156 def reverse(self, n):
157 """
158 字母反转:
159 原始:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
160 n:22 W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
161 n:-22 E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
162 :param n:
163 :return:
164 """
165 s = ""
166 if n >= 0:
167 current = self._head
168 for i in range(n):
169 current = current.get_next()
170 else:
171 current = self._head
172 for i in range(abs(n)):
173 current = current.get_pre()
174 tmp = current
175 while current.get_next() != tmp:
176 s += str(current.get_value()) + " "
177 current = current.get_next()
178 s += str(current.get_value())
179 return s
180
181
182
183
184 if __name__ == '__main__':
185 link_list = DoublyCycleLinkedList()
186 for i in range(65, 91, 1):
187 link_list.append(chr(i))
188
189 print(link_list.size())
190 print(link_list.traverse())
191 print(link_list.traverse1())
192 print(link_list.reverse(22))
193 print(link_list.reverse(-22))