当前位置:   article > 正文

数据结构与算法(Python)——Lesson3

数据结构与算法(Python)——Lesson3

双向链表

一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。

 

  1. class Node(object):
  2. """双向链表节点"""
  3. def __init__(self, item):
  4. self.item = item
  5. self.next = None
  6. self.prev = None
  7. class DLinkList(object):
  8. """双向链表"""
  9. def __init__(self):
  10. self._head = None
  11. def is_empty(self):
  12. """判断链表是否为空"""
  13. return self._head == None
  14. def length(self):
  15. """返回链表的长度"""
  16. cur = self._head
  17. count = 0
  18. while cur != None:
  19. count += 1
  20. cur = cur.next
  21. return count
  22. def travel(self):
  23. """遍历链表"""
  24. cur = self._head
  25. while cur != None:
  26. print(cur.item)
  27. cur = cur.next
  28. print ""
  29. def add(self, item):
  30. """头部插入元素"""
  31. node = Node(item)
  32. if self.is_empty():
  33. # 如果是空链表,将_head指向node
  34. self._head = node
  35. else:
  36. # 将node的next指向_head的头节点
  37. node.next = self._head
  38. # 将_head的头节点的prev指向node
  39. self._head.prev = node
  40. # 将_head 指向node
  41. self._head = node
  42. def append(self, item):
  43. """尾部插入元素"""
  44. node = Node(item)
  45. if self.is_empty():
  46. # 如果是空链表,将_head指向node
  47. self._head = node
  48. else:
  49. # 移动到链表尾部
  50. cur = self._head
  51. while cur.next != None:
  52. cur = cur.next
  53. # 将尾节点cur的next指向node
  54. cur.next = node
  55. # 将node的prev指向cur
  56. node.prev = cur
  57. def search(self, item):
  58. """查找元素是否存在"""
  59. cur = self._head
  60. while cur != None:
  61. if cur.item == item:
  62. return True
  63. cur = cur.next
  64. return False

插入元素:

  1. def insert(self, pos, item):
  2. """在指定位置添加节点"""
  3. if pos <= 0:
  4. self.add(item)
  5. elif pos > (self.length()-1):
  6. self.append(item)
  7. else:
  8. node = Node(item)
  9. cur = self._head
  10. count = 0
  11. # 移动到指定位置的前一个位置
  12. while count < (pos-1):
  13. count += 1
  14. cur = cur.next
  15. # 将node的prev指向cur
  16. node.prev = cur
  17. # 将node的next指向cur的下一个节点
  18. node.next = cur.next
  19. # 将cur的下一个节点的prev指向node
  20. cur.next.prev = node
  21. # 将cur的next指向node
  22. cur.next = node

删除元素

  1. def remove(self, item):
  2. """删除元素"""
  3. if self.is_empty():
  4. return
  5. else:
  6. cur = self._head
  7. if cur.item == item:
  8. # 如果首节点的元素即是要删除的元素
  9. if cur.next == None:
  10. # 如果链表只有这一个节点
  11. self._head = None
  12. else:
  13. # 将第二个节点的prev设置为None
  14. cur.next.prev = None
  15. # 将_head指向第二个节点
  16. self._head = cur.next
  17. return
  18. while cur != None:
  19. if cur.item == item:
  20. # 将cur的前一个节点的next指向cur的后一个节点
  21. cur.prev.next = cur.next
  22. # 将cur的后一个节点的prev指向cur的前一个节点
  23. cur.next.prev = cur.prev
  24. break
  25. cur = cur.next

运行结果:

  1. if __name__ == "__main__":
  2. ll = DLinkList()
  3. ll.add(1)
  4. ll.add(2)
  5. ll.append(3)
  6. ll.insert(2, 4)
  7. ll.insert(4, 5)
  8. ll.insert(0, 6)
  9. print("length:",ll.length())
  10. ll.travel()
  11. print(ll.search(3))
  12. print(ll.search(4))
  13. ll.remove(1)
  14. print("length:",ll.length())
  15. ll.travel()

 

length: 6
6
2
1
4
3
5
True
True
length: 5
6
2
4
3
5
 

 单项循环列表

  1. class Node(object):
  2. """节点"""
  3. def __init__(self, item):
  4. self.item = item
  5. self.next = None
  6. class SinCycLinkedlist(object):
  7. """单向循环链表"""
  8. def __init__(self):
  9. self._head = None
  10. def is_empty(self):
  11. """判断链表是否为空"""
  12. return self._head == None
  13. def length(self):
  14. """返回链表的长度"""
  15. # 如果链表为空,返回长度0
  16. if self.is_empty():
  17. return 0
  18. count = 1
  19. cur = self._head
  20. while cur.next != self._head:
  21. count += 1
  22. cur = cur.next
  23. return count
  24. def travel(self):
  25. """遍历链表"""
  26. if self.is_empty():
  27. return
  28. cur = self._head
  29. print(cur.item)
  30. while cur.next != self._head:
  31. cur = cur.next
  32. print(cur.item)
  33. def add(self, item):
  34. """头部添加节点"""
  35. node = Node(item)
  36. if self.is_empty():
  37. self._head = node
  38. node.next = self._head
  39. else:
  40. #添加的节点指向_head
  41. node.next = self._head
  42. # 移到链表尾部,将尾部节点的next指向node
  43. cur = self._head
  44. while cur.next != self._head:
  45. cur = cur.next
  46. cur.next = node
  47. #_head指向添加node的
  48. self._head = node
  49. def append(self, item):
  50. """尾部添加节点"""
  51. node = Node(item)
  52. if self.is_empty():
  53. self._head = node
  54. node.next = self._head
  55. else:
  56. # 移到链表尾部
  57. cur = self._head
  58. while cur.next != self._head:
  59. cur = cur.next
  60. # 将尾节点指向node
  61. cur.next = node
  62. # 将node指向头节点_head
  63. node.next = self._head
  64. def insert(self, pos, item):
  65. """在指定位置添加节点"""
  66. if pos <= 0:
  67. self.add(item)
  68. elif pos > (self.length()-1):
  69. self.append(item)
  70. else:
  71. node = Node(item)
  72. cur = self._head
  73. count = 0
  74. # 移动到指定位置的前一个位置
  75. while count < (pos-1):
  76. count += 1
  77. cur = cur.next
  78. node.next = cur.next
  79. cur.next = node
  80. def remove(self, item):
  81. """删除一个节点"""
  82. # 若链表为空,则直接返回
  83. if self.is_empty():
  84. return
  85. # 将cur指向头节点
  86. cur = self._head
  87. pre = None
  88. # 若头节点的元素就是要查找的元素item
  89. if cur.item == item:
  90. # 如果链表不止一个节点
  91. if cur.next != self._head:
  92. # 先找到尾节点,将尾节点的next指向第二个节点
  93. while cur.next != self._head:
  94. cur = cur.next
  95. # cur指向了尾节点
  96. cur.next = self._head.next
  97. self._head = self._head.next
  98. else:
  99. # 链表只有一个节点
  100. self._head = None
  101. else:
  102. pre = self._head
  103. # 第一个节点不是要删除的
  104. while cur.next != self._head:
  105. # 找到了要删除的元素
  106. if cur.item == item:
  107. # 删除
  108. pre.next = cur.next
  109. return
  110. else:
  111. pre = cur
  112. cur = cur.next
  113. # cur 指向尾节点
  114. if cur.item == item:
  115. # 尾部删除
  116. pre.next = cur.next
  117. def search(self, item):
  118. """查找节点是否存在"""
  119. if self.is_empty():
  120. return False
  121. cur = self._head
  122. if cur.item == item:
  123. return True
  124. while cur.next != self._head:
  125. cur = cur.next
  126. if cur.item == item:
  127. return True
  128. return False
  129. if __name__ == "__main__":
  130. ll = SinCycLinkedlist()
  131. ll.add(1)
  132. ll.add(2)
  133. ll.append(3)
  134. ll.insert(2, 4)
  135. ll.insert(4, 5)
  136. ll.insert(0, 6)
  137. print("length:",ll.length())
  138. ll.travel()
  139. print(ll.search(3))
  140. print(ll.search(7))
  141. ll.remove(1)
  142. print("length:",ll.length())
  143. ll.travel()

 测试结果:

length: 6
6
2
1
4
3
5
True
False
length: 5
6
2
4
3
5

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/944131
推荐阅读
相关标签
  

闽ICP备14008679号