python 双向链表

Posted tele-share

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 双向链表相关的知识,希望对你有一定的参考价值。

  1 # -*- coding: utf-8 -*-
  2 # @author: Tele
  3 # @Time  : 2019/04/23 下午 3:19
  4 # 双向链表的实现
  5 # 双向链表的每个节点包含三个部分:上一个节点的链接区,数据区,下一个节点的链接区
  6 # 通过双向链表中的任意节点都能访问全部节点
  7 class DoubleNode:
  8     def __init__(self, data):
  9         self.data = data
 10         self.prev = None
 11         self.next = None
 12 
 13 
 14 class DoubleLinkedList:
 15     def __init__(self, data=None):
 16         node = DoubleNode(data)
 17         self.__head = node if node.data else None
 18 
 19     def is_empty(self):
 20         return self.__head == None
 21 
 22     def length(self):
 23         count = 0
 24         cur = self.__head
 25         while cur:
 26             count += 1
 27             cur = cur.next
 28         return count
 29 
 30     # 头部添加元素
 31     def add(self, data):
 32         node = DoubleNode(data)
 33         # 如果列表是空的,也可以用is_empty
 34         if not self.__head:
 35             self.__head = node
 36         else:
 37             self.__head.prev = node
 38             node.next = self.__head
 39             self.__head = node
 40 
 41     # 尾部添加元素
 42     def append(self, data):
 43         node = DoubleNode(data)
 44         if not self.__head:
 45             self.__head = node
 46         else:
 47             cur = self.__head
 48             # 最后一个节点的next为None
 49             while cur.next:
 50                 cur = cur.next
 51             cur.next = node
 52             node.prev = cur
 53 
 54     # 指定位置插入
 55     def insert(self, pos, data):
 56         node = DoubleNode(data)
 57         cur = self.__head
 58         count = 0
 59         if self.length() >= pos >= 0:
 60             while cur:
 61                 if count + 1 == pos:
 62                     node.next = cur.next
 63                     node.prev = cur
 64                     cur.next = node
 65                     break
 66                 # pos为0
 67                 elif count == pos:
 68                     self.add(data)
 69                     break
 70                 count += 1
 71                 cur = cur.next
 72         elif pos < 0:
 73             self.add(data)
 74         else:
 75             self.append(data)
 76         # 如果列表中插入时没有元素
 77         if not self.__head:
 78             self.append(data)
 79 
 80     # 遍历
 81     def travel(self):
 82         cur = self.__head
 83         while cur:
 84             print(cur.data)
 85             cur = cur.next
 86 
 87     def remove(self, data):
 88         count = 0
 89         cur = self.__head
 90         while cur:
 91             # 头节点
 92             if cur.data == data:
 93                 self.__head = cur.next
 94                 break
 95             elif cur.next.data == data:
 96                 if cur.next.next:
 97                     cur.next = cur.next.next
 98                     cur.next.next.prev = cur
 99                 # 尾节点
100                 else:
101                     cur.next = None
102                 break
103             count += 1
104             cur = cur.next
105 
106     # 移除出现的第一个元素
107     # def remove(self, data):
108     #     node = self.__find(data)
109     #     count = 0
110     #     cur = self.__head
111     #     while cur:
112     #         # 如果要移除的元素是头节点
113     #         if cur.data == node.data:
114     #             self.__head = cur.next
115     #             break
116     #         elif cur.next.data == node.data:
117     #             cur.next = node.next
118     #             # 如果node不是最后一个节点
119     #             if node.next:
120     #                 node.next.prev = cur
121     #             break
122     #         count += 1
123     #         cur = cur.next
124     # 私有方法,用于查找节点
125     # def __find(self, data):
126     #     index = -1
127     #     cur = self.__head
128     #     count = 0
129     #     node = DoubleNode(data)
130     #     while cur:
131     #         if cur.data == data:
132     #             index = count
133     #             node.next = cur.next
134     #             break
135     #         count += 1
136     #         cur = cur.next
137     #     return node
138 
139     # 查找,找不到返回-1,找到则返回索引
140     def search(self, data):
141         index = -1
142         cur = self.__head
143         count = 0
144         while cur:
145             if cur.data == data:
146                 index = count
147                 break
148             count += 1
149             cur = cur.next
150         return index
151 
152 
153 def main():
154     dll = DoubleLinkedList()
155     print(dll.is_empty())
156     print(dll.length())
157     dll.add(0)
158     dll.add(1)
159     dll.append(1)
160     dll.append(2)
161     print(dll.is_empty())
162     print(dll.length())
163     # print("*" * 50)
164     # dll.travel()
165     print("*" * 50)
166     dll.insert(-1, 10000)
167     print(dll.search(10000))  # 0
168     dll.travel()
169     dll.remove(1)
170     print("*" * 50)
171     dll.travel()
172 
173 
174 if __name__ == __main__:
175     main()

 

以上是关于python 双向链表的主要内容,如果未能解决你的问题,请参考以下文章

python实现双向链表

Python算法练习--把搜索树转成双向链表

双向链表在循环python中某个节点结束后插入

Python数据结构与算法(2.4)——双向链表

Python 双向链表

python 链表实现 双向链表