双向链表和双向循环链表(无头无尾节点)

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

 

posted @ 2020-04-15 08:58  drealAll  阅读(331)  评论(0)    收藏  举报