1. # 1. 单链表的插入、删除、查找操作;
    2. # 2. 链表中存储的数据类型是 Int
    3. #
    4. # Author:Lee
    5. class Node(object):
    6. """链表结构的 Node 节点"""
    7. def __init__(self, data, next_node=None):
    8. """Node 节点的初始化方法.
    9. 参数:
    10. data: 存储的数据
    11. next: 下一个 Node 节点的引用地址
    12. """
    13. self.__data = data
    14. self.__next = next_node
    15. @property
    16. def data(self):
    17. """Node 节点存储数据的获取.
    18. 返回:
    19. 当前 Node 节点存储的数据
    20. """
    21. return self.__data
    22. @data.setter
    23. def data(self, data):
    24. """Node 节点存储数据的设置方法.
    25. 参数:
    26. data: 新的存储数据
    27. """
    28. self.__data = data
    29. @property
    30. def next_node(self):
    31. """ 获取 Node 节点的 next 指针值.
    32. 返回:
    33. next 指针数据
    34. """
    35. return self.__next
    36. @next_node.setter
    37. def next_node(self, next_node):
    38. """Node 节点 next 指针的修改方法.
    39. 参数:
    40. next: 新的下一个 Node 节点的引用
    41. """
    42. self.__next = next_node
    43. class SinglyLinkedList(object):
    44. """单向链表"""
    45. def __init__(self):
    46. """单向列表的初始化方法."""
    47. self.__head = None
    48. def find_by_value(self, value):
    49. """ 按照数据值在单向列表中查找.
    50. 参数:
    51. value: 查找的数据
    52. 返回:
    53. Node
    54. """
    55. node = self.__head
    56. while (node is not None) and (node.data != value):
    57. node = node.next_node
    58. return node
    59. def find_by_index(self, index):
    60. """ 按照索引值在列表中查找.
    61. 参数:
    62. index: 索引值
    63. 返回:
    64. Node
    65. """
    66. node = self.__head
    67. pos = 0
    68. while (node is not None) and (pos != index):
    69. node = node.next_node
    70. pos += 1
    71. return node
    72. def insert_to_head(self, value):
    73. """ 在链表的头部插入一个存储 value 数值的 Node 节点.
    74. 参数:
    75. value: 将要存储的数据
    76. """
    77. node = Node(value)
    78. node.next_node = self.__head
    79. self.__head = node
    80. def insert_after(self, node, value):
    81. """ 在链表的某个指定 Node 节点之后插入一个存储 value 数据的 Node 节点.
    82. 参数:
    83. node: 指定的一个 Node 节点
    84. value: 将要存储在新 Node 节点中的数据
    85. """
    86. if node is None: # 如果指定在一个空节点之后插入数据节点,则什么都不做
    87. return
    88. new_node = Node(value)
    89. new_node.next_node = node.next
    90. node.next = new_node
    91. def insert_before(self, node, value):
    92. """ 在链表的某个指定 Node 节点之前插入一个存储 value 数据的 Node 节点.
    93. 参数:
    94. node: 指定的一个 Node 节点
    95. value: 将要存储在新的 Node 节点中的数据
    96. """
    97. if (node is None) or (self.__head is None): # 如果指定在一个空节点之前或者空链表之前插入数据节点,则什么都不做
    98. return
    99. if node == self.__head: # 如果是在链表头之前插入数据节点,则直接插入
    100. self.insert_to_head(value)
    101. return
    102. new_node = Node(value)
    103. pro = self.__head
    104. not_found = False # 如果在整个链表中都没有找到指定插入的 Node 节点,则该标记量设置为 True
    105. while pro.next_node != node: # 寻找指定 Node 之前的一个 Node
    106. if pro.next_node is None: # 如果已经到了链表的最后一个节点,则表明该链表中没有找到指定插入的 Node 节点
    107. not_found = True
    108. break
    109. else:
    110. pro = pro.next_node
    111. if not not_found:
    112. pro.next_node = new_node
    113. new_node.next_node = node
    114. def delete_by_node(self, node):
    115. """ 在链表中删除指定 Node 的节点.
    116. 参数:
    117. node: 指定的 Node 节点
    118. """
    119. if self.__head is None: # 如果链表是空的,则什么都不做
    120. return
    121. if node == self.__head: # 如果指定删除的 Node 节点是链表的头节点
    122. self.__head = node.next_node
    123. return
    124. pro = self.__head
    125. not_found = False # 如果在整个链表中都没有找到指定删除的 Node 节点,则该标记量设置为 True
    126. while pro.next_node != node:
    127. if pro.next_node is None: # 如果已经到链表的最后一个节点,则表明该链表中没有找到指定删除的 Node 节点
    128. not_found = True
    129. break
    130. else:
    131. pro = pro.next_node
    132. if not not_found:
    133. pro.next_node = node.next_node
    134. def delete_by_value(self, value):
    135. """ 在链表中删除指定存储数据的 Node 节点.
    136. 参数:
    137. value: 指定的存储数据
    138. """
    139. if self.__head is None: # 如果链表是空的,则什么都不做
    140. return
    141. if self.__head.data == value: # 如果链表的头 Node 节点就是指定删除的 Node 节点
    142. self.__head = self.__head.next_node
    143. pro = self.__head
    144. node = self.__head.next_node
    145. not_found = False
    146. while node.data != value:
    147. if node.next_node is None: # 如果已经到链表的最后一个节点,则表明该链表中没有找到执行 Value 值的 Node 节点
    148. not_found = True
    149. break
    150. else:
    151. pro = node
    152. node = node.next_node
    153. if not_found is False:
    154. pro.next_node = node.next_node
    155. def delete_last_n_node(self, n):
    156. """ 删除链表中倒数第 N 个节点.
    157. 主体思路:
    158. 设置快、慢两个指针,快指针先行,慢指针不动;当快指针跨了 N 步以后,快、慢指针同时往链表尾部移动,
    159. 当快指针到达链表尾部的时候,慢指针所指向的就是链表的倒数第 N 个节点
    160. 参数:
    161. n: 需要删除的倒数第 N 个序数
    162. """
    163. fast = self.__head
    164. slow = self.__head
    165. step = 0
    166. while step <= n:
    167. fast = fast.next_node
    168. step += 1
    169. while fast.next_node is not None:
    170. tmp = slow
    171. fast = fast.next_node
    172. slow = slow.next_node
    173. tmp.next_node = slow.next_node
    174. def find_mid_node(self):
    175. """ 查找链表中的中间节点.
    176. 主体思想:
    177. 设置快、慢两种指针,快指针每次跨两步,慢指针每次跨一步,则当快指针到达链表尾部的时候,慢指针指向链表的中间节点
    178. 返回:
    179. node: 链表的中间节点
    180. """
    181. fast = self.__head
    182. slow = self.__head
    183. while fast.next_node is not None:
    184. fast = fast.next_node.next_node
    185. slow = slow.next_node
    186. return slow
    187. def create_node(self, value):
    188. """ 创建一个存储 value 值的 Node 节点.
    189. 参数:
    190. value: 将要存储在 Node 节点中的数据
    191. 返回:
    192. 一个新的 Node 节点
    193. """
    194. return Node(value)
    195. def print_all(self):
    196. """打印当前链表所有节点数据."""
    197. pos = self.__head
    198. if pos is None:
    199. print("当前链表还没有数据")
    200. return
    201. while pos.next_node is not None:
    202. print(str(pos.data) + " --> ", end="")
    203. pos = pos.next_node
    204. print(str(pos.data))
    205. def reversed_self(self):
    206. """翻转链表自身."""
    207. if self.__head is None or self.__head.next is None: # 如果链表为空,或者链表只有一个节点
    208. return
    209. pre = self.__head
    210. node = self.__head.next
    211. while node is not None:
    212. pre, node = self.__reversed_with_two_node(pre, node)
    213. self.__head.next = None
    214. self.__head = pre
    215. def __reversed_with_two_node(self, pre, node):
    216. """ 翻转相邻两个节点.
    217. 参数:
    218. pre: 前一个节点
    219. node: 当前节点
    220. 返回:
    221. (pre,node): 下一个相邻节点的元组
    222. """
    223. tmp = node.next_node
    224. node.next_node = pre
    225. pre = node # 这样写有点啰嗦,但是能让人更能看明白
    226. node = tmp
    227. return pre, node
    228. def has_ring(self):
    229. """ 检查链表中是否有环.
    230. 主体思想:
    231. 设置快、慢两种指针,快指针每次跨两步,慢指针每次跨一步,如果快指针没有与慢指针相遇而是顺利到达链表尾部
    232. 说明没有环;否则,存在环
    233. 返回:
    234. True: 有环
    235. False: 没有环
    236. """
    237. fast = self.__head
    238. slow = self.__head
    239. while (fast.next_node is not None) and (fast is not None):
    240. fast = fast.next_node
    241. slow = slow.next_node
    242. if fast == slow:
    243. return True
    244. return False