使用python实现双向循环链表,供大家参考,具体内容如下

双向循环链表: 将所有的数据存放到节点中,每一个节点相连接,首尾链接,
每一个节点中有一个数据存储区,和两个链接区,一个链接前一个节点,一个链接下一个节点

双向链表操作

1、链表是否为空
2、链表的长度
3、遍历链表
4、链表头部添加元素
5、链表尾部添加元素
6、链表指定位置添加元素
7、链表删除节点
8、查找节点是否存在

代码实现
`# Functions 函数声明
class Node():
“””实例化节点类”””
def init(self, item):
self.item = item
self.prev = None
self.next = None

class Linklist():
“””
存放节点类
“””
def init(self):
self.head = None

  1. # 1. 链表是否为空
  2. def is_empty(self):
  3. return self.head == None
  4. # 2. 链表的长度
  5. def length(self):
  6. """
  7. 返回链表中所有数据的个数
  8. 实例化游标,遍历链表,使用计数器自增一
  9. 空链表
  10. """
  11. # 实例化游标
  12. cur = self.head
  13. # 判断是否为空
  14. if self.is_empty():
  15. return 0
  16. else:
  17. # 不为空
  18. # 定义计数
  19. count = 1
  20. while cur.next != self.head:
  21. count+=1
  22. cur = cur.next
  23. return count
  24. pass
  25. # 3. 遍历链表
  26. def travel(self):
  27. """
  28. 遍历链表
  29. 实例化游标,遍历链表,每次输出节点的数据
  30. 空链表
  31. 只有头节点
  32. """
  33. # 实例化游标
  34. cur = self.head
  35. # 判断是否为空
  36. if self.is_empty():
  37. return None
  38. else:
  39. # 不为空的情况
  40. while cur.next != self.head:
  41. print(cur.item, end=' ')
  42. cur = cur.next
  43. print(cur.item)
  44. pass
  45. # 4. 链表头部添加元素
  46. def add(self, item):
  47. """
  48. 头节点添加
  49. 实例化节点,
  50. """
  51. # 实例化节点
  52. node = Node(item)
  53. # 实例化游标
  54. cur = self.head
  55. # 判断是否为空
  56. if self.is_empty():
  57. node.next = node
  58. node.prev = node
  59. self.head = node
  60. else:
  61. # 链表不为空的情况
  62. # 只有一个节点的情况
  63. # node.next = self.head
  64. node.next = cur
  65. node.prev = cur
  66. if cur.next == self.head:
  67. # print(cur.item)
  68. cur.prev = node
  69. cur.next = node
  70. self.head = node
  71. elif cur.next != self.head:
  72. pro = self.head
  73. while cur.next != self.head:
  74. cur = cur.next
  75. pro.prev = node
  76. cur.next = node
  77. self.head = node
  78. pass
  79. # 5. 链表尾部添加元素
  80. def append(self, item):
  81. """
  82. 链表尾部添加数据
  83. 实例化节点,实例化游标,指向尾部节点,修改指向
  84. 链表为空
  85. """
  86. # 实例化节点
  87. node = Node(item)
  88. # 实例化游标
  89. cur = self.head
  90. if self.is_empty():
  91. self.add(item)
  92. else:
  93. # 不为空的情况
  94. # 指针指向最后一个节点
  95. self.head.prev = node
  96. node.next = self.head
  97. while cur.next != self.head:
  98. cur = cur.next
  99. node.prev = cur
  100. cur.next = node
  101. pass
  102. # 6. 链表指定位置添加元素
  103. def insert(self, index, item):
  104. """
  105. 指定位置添加数据
  106. 实例化节点, 实例化游标
  107. 移动游标到索引位置,更改指向
  108. 输入索引大小判断
  109. 链表是否为空
  110. """
  111. # 实例化节点
  112. node = Node(item)
  113. # 实例化游标
  114. cur = self.head
  115. if index <= 0:
  116. self.add(item)
  117. elif index > (self.length()-1):
  118. self.append(item)
  119. else:
  120. # 中间添加数据
  121. # 声明计数
  122. count = 0
  123. print(index)
  124. while count < index-1:
  125. count+=1
  126. cur = cur.next
  127. # print(cur.item)
  128. node.next = cur.next
  129. node.prev = cur
  130. cur.next.prev = node
  131. cur.next = node
  132. pass
  133. # 7. 链表删除节点
  134. def remove(self, item):
  135. """
  136. 删除数据
  137. 实例化游标,遍历链表,查找有没有改数据
  138. 有,对改数据两侧的节点进行指向修改
  139. """
  140. # 实例化游标
  141. cur = self.head
  142. # 判断是否为空
  143. if self.is_empty():
  144. return None
  145. else:
  146. # 不为空的情况下
  147. # 如果删除的是头节点
  148. if cur.item == item:
  149. # 如果只有一个头节点
  150. if cur.next == self.head:
  151. self.head = None
  152. else:
  153. # self.head = cur.next
  154. pro = cur.next
  155. while cur.next != self.head:
  156. cur = cur.next
  157. cur.next = pro
  158. pro.prev = cur
  159. self.head = pro
  160. pass
  161. else:
  162. while cur.next != self.head:
  163. if cur.item == item:
  164. # print(cur.item)
  165. pro = cur.prev
  166. nex = cur.next
  167. pro.next = cur.next
  168. nex.prev = pro
  169. return True
  170. else:
  171. cur = cur.next
  172. # 如果是最后一个节点
  173. if cur.item == item:
  174. cur.prev.next = self.head
  175. self.head.prev = cur.prev
  176. # 8. 查找节点是否存在
  177. def search(self, item):
  178. """
  179. 查询指定的数据是否存在
  180. 实例化游标
  181. 遍历所有的节点。每个节点中判断数据是否相等,相等,返回True
  182. """
  183. # 实例化游标
  184. cur = self.head
  185. # 判断是否为空
  186. if self.is_empty():
  187. return None
  188. else:
  189. # 不为空的情况
  190. # 遍历所有的节点
  191. while cur.next != self.head:
  192. if cur.item == item:
  193. return True
  194. else:
  195. cur = cur.next
  196. if cur.item == item:
  197. return True
  198. pass`

测试运行
# 程序的入口if __name__ == "__main__": a = Linklist() a .add(400) a .add(300) a .add(200) a .add(100) a.append(10) a.append(11) a.add(1) a.insert(30, 12) # 1 100 200 300 400 10 11 12 a.remove(1) # 100 200 300 400 10 11 12 a.remove(12) # 100 200 300 400 10 11 a.remove(400) # # 100 200 300 10 11 a.remove(4000) print(a.search(100)) # True print(a.search(11)) # True print(a.search(111)) # None print(a.is_empty()) # False a.travel() # 100 200 300 10 11 print(a.length()) # 5 pass

更多相关文章

  1. Android(安卓)解决Could not find com.android.tools.build:grad
  2. Android之如何使用junit
  3. Android根据电话号码取得联系人姓名及头像
  4. Android解析XML文件的三种方式
  5. Android之USB Camera摄像头节点后移
  6. android中使用properties文件配置
  7. android软件安全攻防实例第一章笔记
  8. Android布局优化
  9. 【Android】How Android(安卓)Draws Views

随机推荐

  1. 【ASP.NET Web API教程】5.2 发送HTML表
  2. html5 svg 第八章 文字text
  3. 我可以在所有浏览器中使用我的屏幕外菜单
  4. CSS+HTML+JQuery实现条形图
  5. 程序员送女朋友的礼物:域名和祝福视频
  6. 获取图像特定区域的所有多边形坐标?
  7. chrome禁用缓存:调试html5方便
  8. htmlhref属性最大支持多少个字符???(高分)
  9. 如何使flex box在safari中工作?
  10. 如何使用Java浏览和显示XML内容