linked_list.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. class Node(object):
  2. def __init__(self, value):
  3. self.value = value
  4. self.next = None
  5. class LinkedListOneway(object):
  6. def __init__(self, node=None):
  7. self.__head = node
  8. def get_head(self):
  9. return self.__head
  10. def __len__(self):
  11. cur = self.__head
  12. count = 0
  13. while cur:
  14. count += 1
  15. cur = cur.next
  16. return count
  17. def is_empty(self):
  18. return self.__head == None
  19. def add(self, value):
  20. """
  21. 头插法
  22. 先让新节点的next指向头节点
  23. 再将头节点替换为新节点
  24. 顺序不可错,要先保证原链表的链不断,否则头节点后面的链会丢失
  25. """
  26. node = Node(value)
  27. node.next = self.__head
  28. self.__head = node
  29. def append(self, value):
  30. """
  31. 尾插法
  32. :param value:
  33. :return:
  34. """
  35. node = Node(value)
  36. cur = self.__head
  37. if self.is_empty():
  38. self.__head = node
  39. else:
  40. while cur.next:
  41. cur = cur.next
  42. cur.next = node
  43. def insert(self, pos, value):
  44. # 插入指定位置
  45. if pos <= 0:
  46. self.add(value)
  47. elif pos > len(self) - 1:
  48. self.append(value)
  49. else:
  50. node = Node(value)
  51. prior = self.__head
  52. count = 0
  53. # 在插入位置的前一个节点停下
  54. while count < (pos - 1):
  55. prior = prior.next
  56. count += 1
  57. # 先将插入节点与节点后的节点连接,防止链表断掉,先链接后面的,再链接前面的
  58. node.next = prior.next
  59. prior.next = node
  60. def remove_value(self, value):
  61. """
  62. 删除值
  63. :param value:
  64. :return:
  65. """
  66. curr = self.__head
  67. if curr is None:
  68. raise Exception("链表为空,无法删除值")
  69. i = 0
  70. while curr:
  71. if curr.value == value:
  72. break
  73. curr = curr.next
  74. i += 1
  75. prior = self.__head
  76. j = 0
  77. k = i
  78. while prior:
  79. if j == k - 1:
  80. print(j)
  81. break
  82. prior = prior.next
  83. j += 1
  84. if i == 0:
  85. self.__head = self.__head.next
  86. elif i > self.__len__() - 1:
  87. raise Exception("未查询到此数据")
  88. elif 0 < i < self.__len__() - 1:
  89. nextnext = prior.next
  90. prior.next = nextnext.next
  91. else:
  92. pass
  93. print("删除的值为:%s 位置为:%s" % (value, i))
  94. def remove_index(self, index):
  95. cur = self.__head
  96. if cur is None:
  97. raise Exception('链表为空,无法删除')
  98. if index > self.__len__():
  99. raise Exception('下标越界')
  100. stu = self.__head
  101. for i in range(index - 1):
  102. stu = stu.nex
  103. temp = stu.next
  104. stu.next = temp.next
  105. def search(self, value):
  106. cur = self.__head
  107. if cur is None:
  108. raise Exception('链表为空')
  109. while cur is not None:
  110. if cur.value == value:
  111. return True
  112. else:
  113. cur = cur.next
  114. return False
  115. def reverse(self):
  116. cur = self.__head
  117. pre = None
  118. while cur:
  119. prenext = cur.next
  120. cur.next = pre
  121. pre = cur
  122. cur = prenext
  123. self.__head = pre
  124. def show(self):
  125. cur = self.__head
  126. while cur:
  127. print(cur.value)
  128. cur = cur.next
  129. if __name__ == '__main__':
  130. head = LinkedListOneway()
  131. head.append(1)
  132. head.append(2)
  133. head.append(3)
  134. head.insert(2, 5)
  135. head.remove_value(3)
  136. # head.reverse()
  137. head.show()