python-实现双链表

  1 # encoding=utf-8
  2 
  3 
  4 class Node(object):
  5     def __init__(self, item):
  6         self.item = item
  7         self.next = None
  8         self.pre = None
  9 
 10 
 11 class DoubleLink(object):
 12     """双向链表"""
 13     def __init__(self, node=None):
 14         self.__head = node
 15 
 16     def is_empty(self):
 17         """链表是否为空"""
 18         return self.__head is None
 19 
 20     def length(self):
 21         """链表长度"""
 22         current = self.__head
 23         count = 0
 24         while current is not None:
 25             count += 1
 26             current = current.next
 27 
 28         return count
 29 
 30     def travel(self):
 31         """遍历整个链表 要考虑空链表如果是空链表判断条件不成立也就不输出任何信息"""
 32         current = self.__head
 33         while current is not None:
 34             print(current.item, end=" ")
 35             current = current.next
 36 
 37         print("")  # 多输出换行
 38 
 39     def search(self, item):
 40         """
 41         查找节点是否存在
 42         :param item: 要查找的element
 43         :return:
 44         """
 45         cur = self.__head
 46 
 47         while cur is not None:
 48             if cur.item == item:
 49                 return True
 50             cur = cur.next
 51 
 52         return False
 53 
 54     def add(self, item):
 55         """"在链表头部插入元素"""
 56         node = Node(item)
 57         if self.is_empty():
 58             self.__head = node
 59         else:
 60             node.next = self.__head
 61             self.__head.pre = node
 62             self.__head = node
 63 
 64     def append(self, item):
 65         """"在链表尾部插入节点"""
 66         node = Node(item)
 67         if self.is_empty():
 68             self.__head = node
 69         else:
 70             # 寻找尾节点
 71             cur = self.__head
 72             while cur.next is not None:
 73                 cur = cur.next
 74             cur.next = node
 75             node.pre = cur
 76 
 77 
 78     def insert(self, pos, item):
 79         """指定位置添加元素"""
 80         # 在头结点插入元素
 81         if pos <=0:
 82             self.add(item)
 83         # 在链表的尾部添加元素
 84         elif pos >= self.length():
 85             self.append(item)
 86         # 在链表的任意位置添加元素
 87         else:
 88             cur = self.__head
 89             count = 0
 90             # 找到添加位置
 91             while count < pos:
 92                 count += 1
 93                 cur = cur.next
 94             node = Node(item)
 95 
 96             node.next = cur
 97             node.pre = cur.pre
 98             cur.pre = node
 99             node.pre.next = node
100 
101 
102     def remove(self, item):
103         """
104         删除节点
105         :param item: 要删除的元素
106         :return:
107         """
108 
109         cur = self.__head
110         while cur is not None:
111             # 找到了元素
112             if cur.item == item:
113                 # 在头部找到了元素
114                 if cur == self.__head:
115                     self.__head = cur.next
116                     if cur.next:
117                         cur.next.pre = None
118                 else:
119                     cur.pre.next = cur.next
120                     if cur.next:
121                         cur.next.pre = cur.pre
122 
123                 return
124             cur = cur.next
125 
126 
127 
128 if __name__ == '__main__':
129     ll = DoubleLink()
130     print(ll.length())
131 
132     ll.append(1)   # 1
133     print(ll.length())
134     ll.travel()
135 
136     ll.append(2)   #1 2
137     print(ll.length())
138     ll.travel()
139 
140     ll.add(3)   # 3 1 2
141     ll.travel()
142 
143     ll.add(4) # 4 3 1 2
144     ll.travel()
145 
146     ll.insert(0, 5)  # 5 4 3 1 2
147     ll.travel()
148 
149     ll.insert(10, 6)  # 5 4 3 1 2  6
150     ll.travel()
151 
152     ll.insert(3, 7)  # 5 4 3  7 1 2  6
153     ll.travel()
154 
155     ll.remove(5)  #  4 3  7 1 2  6)
156     ll.travel()
157 
158     ll.remove(6)  #  4 3  7 1 2
159     ll.travel()
160 
161     ll.remove(7)  #  4 3  1 2
162     ll.travel()
163 
164     ll.remove(4)  #  3  1 2
165     ll.travel()
166     ll.remove(3)  #   1 2
167     ll.travel()
168     ll.remove(1)  #  2
169     ll.travel()
170     ll.remove(2)
171     ll.travel()
原文地址:https://www.cnblogs.com/wgDream/p/7525957.html