python算法与数据结构-双向链表

た 入场券 2023-10-06 01:25 116阅读 0赞

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 3

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 4

尾部添加元素如下所示:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 5

指定位置插入元素如下所示:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 6

上面的对的可以比照下面的图片看,node2节点相当于上图中的cur节点,如下所示:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 7

代码等价于:

node.next = cur <===> node.next = node2
node.prev = cur.prev <===> node.prev = node1
cur.prev.next = node <===> node1.next = node
cur.prev = node <===> node2.prev = node

删除元素如下所示:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 8

结合下图查看,如下所示:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 9

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 10

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2diNDIxNTI4Nw_size_16_color_FFFFFF_t_70 11

具体代码如下所示:

  1. # -*-coding=utf-8-*-
  2. class Node(object):
  3. """结点"""
  4. def __init__(self,item):
  5. self.elem = item
  6. self.next = None
  7. self.prev = None
  8. class DoubleLinkList(object):
  9. """双链表"""
  10. def __init__(self,node=None):
  11. self.__head = None
  12. def is_empty(self):
  13. """链表是否为空"""
  14. return self.__head is None
  15. def length(self):
  16. """链表长度"""
  17. #cur游标,用来移动遍历节点
  18. cur = self.__head
  19. #count 记录数量
  20. count = 0
  21. while cur != None:
  22. count+=1
  23. cur = cur.next
  24. return count
  25. def travel(self):
  26. """遍历整个链表"""
  27. cur = self.__head
  28. while cur != None:
  29. print(cur.elem,end=" ")
  30. cur = cur.next
  31. print("")
  32. def add(self,item):
  33. """链表头部添加元素,头插法"""
  34. node = Node(item)
  35. #先写箭头指向右边的代码,node节点先写next方向的,再写prev方向的
  36. node.next = self.__head
  37. self.__head = node
  38. #最后写箭头指向左边的代码
  39. node.next.prev = node
  40. def append(self,item):
  41. """链表尾部添加元素,尾插法"""
  42. node = Node(item)
  43. if self.is_empty():
  44. self.__head = node
  45. else:
  46. cur = self.__head
  47. while cur.next != None:
  48. cur = cur.next
  49. cur.next = node
  50. node.prev = cur
  51. def insert(self, pos, item):
  52. """链表指定位置添加元素
  53. :param pos 从0开始
  54. """
  55. # 若指定位置pos为第一个元素之前,则执行头部插入
  56. if pos <= 0: # 头插法
  57. self.add(item)
  58. # 若指定位置超过链表尾部,则执行尾部插入
  59. elif pos > (self.length() - 1): # 尾插法
  60. self.append(item)
  61. # 找到指定位置
  62. else:
  63. # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置
  64. cur = self.__head
  65. count = 0
  66. while count < pos:
  67. count += 1
  68. cur = cur.next
  69. # 当循环退出后,cur指向pos位置
  70. node = Node(item)
  71. node.next = cur
  72. node.prev = cur.prev
  73. cur.prev.next = node
  74. cur.prev = node
  75. def remove(self, item):
  76. """删除节点"""
  77. cur = self.__head
  78. while cur != None:
  79. # 找到了指定元素
  80. if cur.elem == item:
  81. # 先判断此节点是否是头节点
  82. # 头节点 # 如果第一个就是删除的节点
  83. if cur == self.__head:
  84. # 将头指针指向头节点的后一个节点
  85. self.__head = cur.next
  86. if cur.next:
  87. #判断链表是否只有一个节点
  88. cur.next.prev = None
  89. else:
  90. cur.prev.next = cur.next
  91. if cur.next:
  92. cur.next.prev = cur.prev
  93. break # 删除后再退出循环,需要一个总的break退出
  94. else:
  95. # 继续按链表后移节点
  96. cur = cur.next
  97. def search(self, item):
  98. """查找节点是否存在"""
  99. """链表查找节点是否存在,并返回True或者False"""
  100. cur = self.__head
  101. while cur != None:
  102. if cur.elem == item:
  103. return True
  104. else:
  105. cur = cur.next
  106. return False
  107. if __name__ == "__main__":
  108. # node = Node(100)
  109. ll = DoubleLinkList()
  110. print(ll.is_empty()) # True
  111. print(ll.length()) # 0
  112. ll.append(1)
  113. print(ll.is_empty()) # False
  114. print(ll.length()) # 1
  115. ll.append(2)
  116. ll.add(8)
  117. ll.append(3)
  118. ll.append(4)
  119. ll.append(5)
  120. ll.append(6)
  121. # 8 1 2 3 4 5 6
  122. ll.insert(-1, 9)
  123. ll.travel() # 9 8 1 2 3 4 5 6
  124. ll.insert(3, 100)
  125. ll.travel() # 9 8 1 100 2 3 4 5 6
  126. ll.insert(10, 200)
  127. ll.travel() # 9 8 1 100 2 3 4 5 6 200
  128. ll.remove(100)
  129. ll.travel() # 9 8 1 2 3 4 5 6 200
  130. ll.remove(9)
  131. ll.travel() # 8 1 2 3 4 5 6 200
  132. ll.remove(200)
  133. ll.travel() # 8 1 2 3 4 5 6

参考:来源网上

https://www.cnblogs.com/Se7eN-HOU/p/11103891.html

发表评论

表情:
评论列表 (有 0 条评论,116人围观)

还没有评论,来说两句吧...

相关阅读