一个简单的单向链表实现,Python

x33g5p2x  于2021-12-11 转载在 Python  
字(3.2k)|赞(0)|评价(0)|浏览(267)

每一个节点包含值和指向下一个节点的指针。当前节点指向下一个节点是一个对象,直接打印是一串不容易识别的序列号,因此把下一个节点的值装入到当前节点,易于阅读和调试。

  1. import random
  2. VALUE = 'value'
  3. NEXT = 'next'
  4. class Node:
  5. def __init__(self, value):
  6. self.value = value
  7. self.next = None
  8. def __str__(self):
  9. next_v = None
  10. if self.next is not None:
  11. next_v = self.next.value
  12. return str({VALUE: self.value, NEXT: next_v})
  13. # 加入到LinkList的节点
  14. class LinkList(object):
  15. def __init__(self):
  16. self.head = None
  17. def append(self, value):
  18. node = Node(value)
  19. node.next = None
  20. if self.head is None:
  21. self.head = node
  22. else:
  23. cur = self.head
  24. while True:
  25. if cur.next is None:
  26. break
  27. else:
  28. cur = cur.next
  29. cur.next = node
  30. # 根据一个值查找该节点
  31. def find(self, v):
  32. node = Node
  33. cur = self.head
  34. while cur is not None:
  35. if cur.value == v:
  36. node = cur
  37. break
  38. cur = cur.next
  39. return node
  40. # 在指定的链表位置pos处插入节点node
  41. def insert(self, pos, node):
  42. if pos == 0:
  43. node.next = self.head
  44. self.head = node
  45. else:
  46. pos_node = self.get_node_by_pos(pos)
  47. pos_pre_node = self.get_node_by_pos(pos - 1)
  48. pos_pre_node.next = node
  49. node.next = pos_node
  50. # 删除位于链表pos位置的节点
  51. def delete_node(self, pos):
  52. # 删除最头部节点
  53. if pos == 0:
  54. # 如果链表长度为1,直接将链表的head置为None
  55. if self.size() == 1:
  56. self.head = None
  57. else:
  58. next_node = self.get_node_by_pos(pos + 1)
  59. self.head = next_node
  60. return
  61. # 删除最尾部节点
  62. if pos == (self.size() - 1):
  63. pre_node = self.get_node_by_pos(pos - 1)
  64. pre_node.next = None
  65. return
  66. # 删除介于中间部位的节点(非最头和最尾节点)
  67. pre_node = self.get_node_by_pos(pos - 1)
  68. next_node = self.get_node_by_pos(pos + 1)
  69. pre_node.next = next_node
  70. def items(self):
  71. nodes = []
  72. cur = self.head
  73. while cur is not None:
  74. nodes.append(cur)
  75. cur = cur.next
  76. return nodes
  77. def size(self):
  78. count = 0
  79. cur = self.head
  80. while cur is not None:
  81. count = count + 1
  82. cur = cur.next
  83. return count
  84. # 返回链表对应序号位置的节点。
  85. def get_node_by_pos(self, pos):
  86. count = 0
  87. node = None
  88. cur = self.head
  89. while cur is not None:
  90. if count == pos:
  91. node = cur
  92. break
  93. cur = cur.next
  94. count = count + 1
  95. return node
  96. # 在列表中的随机位置插入一个值v
  97. def random_insert(link, v):
  98. print('--')
  99. pos = random.randint(0, link.size() - 1)
  100. print('插入pos =', pos)
  101. link.insert(pos, Node(v))
  102. def app():
  103. link = LinkList()
  104. for i in range(5):
  105. link.append(random.randint(1, 10000))
  106. print('-')
  107. print('原始随机链表')
  108. print_node(link)
  109. random_insert(link, 'zhang')
  110. print_node(link)
  111. random_insert(link, 'phil')
  112. print_node(link)
  113. print('---')
  114. print('删除 pos = 0')
  115. link.delete_node(0)
  116. print_node(link)
  117. print('---')
  118. print('删除 pos = 1')
  119. link.delete_node(1)
  120. print_node(link)
  121. print('---')
  122. print('删除 pos = ', link.size() - 1)
  123. link.delete_node(link.size() - 1)
  124. print_node(link)
  125. def print_node(link):
  126. for n in link.items():
  127. print('节点', n)
  128. print('长度', link.size())
  129. if __name__ == '__main__':
  130. app()

输出:

  1. -
  2. 原始随机链表
  3. 节点 {'value': 8018, 'next': 4938}
  4. 节点 {'value': 4938, 'next': 3066}
  5. 节点 {'value': 3066, 'next': 579}
  6. 节点 {'value': 579, 'next': 5003}
  7. 节点 {'value': 5003, 'next': None}
  8. 长度 5
  9. --
  10. 插入pos = 1
  11. 节点 {'value': 8018, 'next': 'zhang'}
  12. 节点 {'value': 'zhang', 'next': 4938}
  13. 节点 {'value': 4938, 'next': 3066}
  14. 节点 {'value': 3066, 'next': 579}
  15. 节点 {'value': 579, 'next': 5003}
  16. 节点 {'value': 5003, 'next': None}
  17. 长度 6
  18. --
  19. 插入pos = 1
  20. 节点 {'value': 8018, 'next': 'phil'}
  21. 节点 {'value': 'phil', 'next': 'zhang'}
  22. 节点 {'value': 'zhang', 'next': 4938}
  23. 节点 {'value': 4938, 'next': 3066}
  24. 节点 {'value': 3066, 'next': 579}
  25. 节点 {'value': 579, 'next': 5003}
  26. 节点 {'value': 5003, 'next': None}
  27. 长度 7
  28. ---
  29. 删除 pos = 0
  30. 节点 {'value': 'phil', 'next': 'zhang'}
  31. 节点 {'value': 'zhang', 'next': 4938}
  32. 节点 {'value': 4938, 'next': 3066}
  33. 节点 {'value': 3066, 'next': 579}
  34. 节点 {'value': 579, 'next': 5003}
  35. 节点 {'value': 5003, 'next': None}
  36. 长度 6
  37. ---
  38. 删除 pos = 1
  39. 节点 {'value': 'phil', 'next': 4938}
  40. 节点 {'value': 4938, 'next': 3066}
  41. 节点 {'value': 3066, 'next': 579}
  42. 节点 {'value': 579, 'next': 5003}
  43. 节点 {'value': 5003, 'next': None}
  44. 长度 5
  45. ---
  46. 删除 pos = 4
  47. 节点 {'value': 'phil', 'next': 4938}
  48. 节点 {'value': 4938, 'next': 3066}
  49. 节点 {'value': 3066, 'next': 579}
  50. 节点 {'value': 579, 'next': None}
  51. 长度 4

相关文章