• 链表(单链表、双链表)


    前言:链表是算法中比较难理解的部分,本博客记录单链表、双链表学习,理解节点和指针的使用,主要内容包括:使用python创建链表、实现链表常见的操作。

    目录

    单链表

    双链表


    单链表

    引入链表的背景:

    先来看一下数据,数组是一块连续的区域,需要预留空间。

    链表,是一种线性表,线性表包括顺序表、链表,但链表不像顺序表一样连续地存储数据,而是在每个节点里存放下一个节点的位置信息(地址)。

    单链表,第一个节点是头节点,最后一个节点是尾节点。

    操作链表时,需要注意特殊的情况:

    1. 空链表
    2. 只有一个头节点没有尾节点的链表,头节点地址指向空
    3. 有一个头节点,接着连接一个尾节点,没有中间节点

    使用python语言创建一个单链表

    需要实现以下功能:

    • 实现判断链表是否为空
    • 计算链表的长度
    • 在链表头部添加元素
    • 在链表尾部添加元素
    • 在链表的指定位置添加元素
    • 删除指定元素的节点
    • 判断节点是否存在
    1. class Node(object):
    2. def __init__(self, elem):
    3. # 节点
    4. self.elem = elem
    5. self.next = None
    6. # 单链表
    7. class SingleLinkList(object):
    8. def __init__(self, node=None):
    9. self.__head = node
    10. # 判断链表是否为空
    11. def is_empty(self):
    12. return self.__head == None
    13. # 链表的长度
    14. def length(self):
    15. # cur游标用来遍历节点
    16. cur = self.__head
    17. count = 1
    18. while cur != None:
    19. count += 1
    20. cur = cur.next
    21. return count
    22. # 链表的遍历
    23. def travel(self):
    24. cur = self.__head
    25. while cur != None:
    26. print(cur.elem, end=" ")
    27. cur = cur.next
    28. # 头部添加元素
    29. def add(self, item):
    30. node = Node(item)
    31. node.next = self.__head
    32. self.__head = node
    33. # 尾部添加元素
    34. def append(self, item):
    35. node = Node(item)
    36. if self.is_empty():
    37. self.__head = node
    38. else:
    39. cur = self.__head
    40. while cur.next != None:
    41. cur = cur.next
    42. cur.next = node
    43. pass
    44. # 指定位置添加元素
    45. def insert(self, pos, item):
    46. if pos <= 0:
    47. self.add(item)
    48. elif pos > (self.length() - 1):
    49. self.append(item)
    50. else:
    51. pre = self.__head
    52. count = 0
    53. while count < (pos - 1):
    54. count += 1
    55. pre = pre.next
    56. # 当循环退出后 pre指向pos-1
    57. node = Node(item)
    58. node.next = pre.next
    59. pre.next = node
    60. # 删除元素 找到具体的数据删除
    61. def remove(self, item):
    62. cur = self.__head
    63. pre = None
    64. while cur != None:
    65. if cur.elem == item:
    66. if cur == self.__head:
    67. self.__head = cur.next
    68. else:
    69. pre.next = cur.next
    70. break
    71. else:
    72. pre = cur
    73. cur = cur.next
    74. # 查找节点是否存在
    75. def search(self, item):
    76. cur = self.__head
    77. while cur != None:
    78. if cur.elem == item:
    79. return True
    80. else:
    81. cur = cur.next
    82. return False

    双链表

    双链表比单链表多了个前驱节点

    使用python语言创建一个双链表

    需要实现以下功能:

    • 实现判断链表是否为空
    • 计算链表的长度
    • 在链表头部添加元素
    • 在链表尾部添加元素
    • 在链表的指定位置添加元素
    • 删除指定元素的节点
    • 判断节点是否存在

     

    1. class Node(object):
    2. def __init__(self, item):
    3. self.elem = item
    4. self.next = None
    5. self.prev = None
    6. class DoubleLinkList(object):
    7. # 双链表
    8. def __init__(self, node=None):
    9. self.__head = node
    10. # 判断链表是否为空
    11. def is_empty(self):
    12. return self.__head == None
    13. # 链表的长度
    14. def length(self):
    15. # cur游标用来遍历节点
    16. cur = self.__head
    17. count = 1
    18. while cur != None:
    19. count += 1
    20. cur = cur.next
    21. return count
    22. # 链表的遍历
    23. def travel(self):
    24. cur = self.__head
    25. while cur != None:
    26. print(cur.elem, end=" ")
    27. cur = cur.next
    28. # 头部添加元素
    29. def add(self, item):
    30. node = Node(item)
    31. node.next = self.__head
    32. self.__head = node
    33. node.next.prev = node
    34. # 尾部添加元素
    35. def append(self, item):
    36. node = Node(item)
    37. if self.is_empty():
    38. self.__head = node
    39. else:
    40. cur = self.__head
    41. while cur.next != None:
    42. cur = cur.next
    43. cur.next = node
    44. node.prev = cur
    45. pass
    46. # 指定位置添加元素
    47. def insert(self, pos, item):
    48. if pos <= 0:
    49. self.add(item)
    50. elif pos > (self.length() - 1):
    51. self.append(item)
    52. else:
    53. cur = self.__head
    54. count = 0
    55. while count < (pos - 1):
    56. count += 1
    57. cur = cur.next
    58. # 当循环退出后 pre指向pos
    59. node = Node(item)
    60. node.next = cur
    61. node.prev = cur.prev
    62. cur.prev.next = node
    63. cur.prev = node
    64. # 删除元素 找到具体的数据删除
    65. def remove(self, item):
    66. cur = self.__head
    67. while cur != None:
    68. if cur.elem == item:
    69. if cur == self.__head:
    70. self.__head = cur.next
    71. if cur.next:
    72. # 判断链表是否只有一个节点
    73. cur.next.prev = None
    74. else:
    75. cur.prev.next = cur.next
    76. if cur.next:
    77. cur.next.prev = cur.prev
    78. break
    79. else:
    80. cur = cur.next
    81. # 查找节点是否存在
    82. def search(self, item):
    83. cur = self.__head
    84. while cur != None:
    85. if cur.elem == item:
    86. return True
    87. else:
    88. cur = cur.next
    89. return False
  • 相关阅读:
    电子统计台账:垂直流水账格式数据的导入
    JS前端使用Blob和File读取文件的操作代码
    Terraform expressions 表达式
    【视觉高级篇】22 # 如何用仿射变换来移动和旋转3D物体?
    Python基础——数据类型
    优秀的网络工程师,需要具备什么?
    kotlin flow sample的用法
    关于node安装和nvm安装的问题
    MapReduce概述及工作流程
    Keras深度学习实战(22)——生成对抗网络详解与实现
  • 原文地址:https://blog.csdn.net/MRJJ_9/article/details/133317892