单向链表

单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

  • 表元素域elem用来存放具体的数据。
  • 链接域next用来存放下一个节点的位置(python中的标识)
  • 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。

节点实现

  1. class Node(object):
  2. """节点"""
  3. def __init__(self, elem):
  4. self.elem = elem
  5. self.next = None

单链表的操作

  • is_empty() 链表是否为空
  • length() 链表长度
  • travel() 遍历整个链表
  • add(item) 链表头部添加元素
  • append(item) 链表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 删除节点
  • search(item) 查找节点是否存在

单链表的实现

  1. class SingleLinkList(object):
  2. """单链表"""
  3. def __init__(self, node=None):
  4. self.__head = node

单链表 判断链表是否为空(is_empty)

  1. def is_empty(self):
  2. """链表是否为空"""
  3. return self.__head == None

单链表 链表长度(length)

  1. def length(self):
  2. """链表长度"""
  3. # cur游标,用来移动遍历节点
  4. cur = self.__head
  5. # count记录数量
  6. count = 0
  7. while cur != None:
  8. count += 1
  9. cur = cur.next
  10. return count

单链表 遍历整个链表(travel)

  1. def travel(self):
  2. """遍历整个链表"""
  3. cur = self.__head
  4. while cur != None:
  5. print(cur.elem, end=" ")
  6. cur = cur.next
  7. print("")

单链表 链表尾部添加元素,尾插法(append)

  1. def append(self, item):
  2. """链表尾部添加元素, 尾插法"""
  3. node = Node(item)
  4. if self.is_empty():
  5. self.__head = node
  6. else:
  7. cur = self.__head
  8. while cur.next != None:
  9. cur = cur.next
  10. cur.next = node

单链表 链表头部插入元素,头插法(add)

  1. def add(self, item):
  2. """链表头部添加元素,头插法"""
  3. node = Node(item)
  4. node.next = self.__head
  5. self.__head = node

单链表 指定位置插入元素(insert)

  1. def insert(self, pos, item):
  2. """指定位置添加元素
  3. :param pos 从0开始
  4. """
  5. if pos <= 0:
  6. self.add(item)
  7. elif pos > (self.length()-1):
  8. self.append(item)
  9. else:
  10. pre = self.__head
  11. count = 0
  12. while count < (pos-1):
  13. count += 1
  14. pre = pre.next
  15. # 当循环退出后,pre指向pos-1位置
  16. node = Node(item)
  17. node.next = pre.next
  18. pre.next = node

单链表 删除节点(remove)

  1. def remove(self, item):
  2. """删除节点"""
  3. cur = self.__head
  4. pre = None
  5. while cur != None:
  6. if cur.elem == item:
  7. # 先判断此结点是否是头节点
  8. # 头节点
  9. if cur == self.__head:
  10. self.__head = cur.next
  11. else:
  12. pre.next = cur.next
  13. break
  14. else:
  15. pre = cur
  16. cur = cur.next

单链表 查找节点是否存在(search)

  1. def search(self, item):
  2. """查找节点是否存在"""
  3. cur = self.__head
  4. while cur != None:
  5. if cur.elem == item:
  6. return True
  7. else:
  8. cur = cur.next
  9. return False

单链表 完整代码及测试

  1. # coding:utf-8
  2.  
  3. class Node(object):
  4. """节点"""
  5. def __init__(self, elem):
  6. self.elem = elem
  7. self.next = None
  8.  
  9. class SingleLinkList(object):
  10. """单链表"""
  11. def __init__(self, node=None):
  12. self.__head = node
  13.  
  14. def is_empty(self):
  15. """链表是否为空"""
  16. return self.__head == None
  17.  
  18. def length(self):
  19. """链表长度"""
  20. # cur游标,用来移动遍历节点
  21. cur = self.__head
  22. # count记录数量
  23. count = 0
  24. while cur != None:
  25. count += 1
  26. cur = cur.next
  27. return count
  28.  
  29. def travel(self):
  30. """遍历整个链表"""
  31. cur = self.__head
  32. while cur != None:
  33. print(cur.elem, end=" ")
  34. cur = cur.next
  35. print("")
  36.  
  37. def add(self, item):
  38. """链表头部添加元素,头插法"""
  39. node = Node(item)
  40. node.next = self.__head
  41. self.__head = node
  42.  
  43. def append(self, item):
  44. """链表尾部添加元素, 尾插法"""
  45. node = Node(item)
  46. if self.is_empty():
  47. self.__head = node
  48. else:
  49. cur = self.__head
  50. while cur.next != None:
  51. cur = cur.next
  52. cur.next = node
  53.  
  54. def insert(self, pos, item):
  55. """指定位置添加元素
  56. :param pos 从0开始
  57. """
  58. if pos <= 0:
  59. self.add(item)
  60. elif pos > (self.length()-1):
  61. self.append(item)
  62. else:
  63. pre = self.__head
  64. count = 0
  65. while count < (pos-1):
  66. count += 1
  67. pre = pre.next
  68. # 当循环退出后,pre指向pos-1位置
  69. node = Node(item)
  70. node.next = pre.next
  71. pre.next = node
  72.  
  73. def remove(self, item):
  74. """删除节点"""
  75. cur = self.__head
  76. pre = None
  77. while cur != None:
  78. if cur.elem == item:
  79. # 先判断此结点是否是头节点
  80. # 头节点
  81. if cur == self.__head:
  82. self.__head = cur.next
  83. else:
  84. pre.next = cur.next
  85. break
  86. else:
  87. pre = cur
  88. cur = cur.next
  89.  
  90. def search(self, item):
  91. """查找节点是否存在"""
  92. cur = self.__head
  93. while cur != None:
  94. if cur.elem == item:
  95. return True
  96. else:
  97. cur = cur.next
  98. return False
  99.  
  100. if __name__ == "__main__":
  101. ll = SingleLinkList()
  102. print(ll.is_empty())
  103. print(ll.length())
  104.  
  105. ll.append(1)
  106. print(ll.is_empty())
  107. print(ll.length())
  108.  
  109. ll.append(2)
  110. ll.add(8)
  111. ll.append(3)
  112. ll.append(4)
  113. ll.append(5)
  114. ll.append(6)
  115. # 8 1 2 3 4 5 6
  116. ll.insert(-1, 9) # 9 8 1 23456
  117. ll.travel()
  118. ll.insert(3, 100) # 9 8 1 100 2 3456
  119. ll.travel()
  120. ll.insert(10, 200) # 9 8 1 100 23456 200
  121. ll.travel()
  122. ll.remove(100)
  123. ll.travel()
  124. ll.remove(9)
  125. ll.travel()
  126. ll.remove(200)
  127. ll.travel()
  128. """
  129. result:
  130. True
  131. 0
  132. False
  133. 1
  134. 9 8 1 2 3 4 5 6
  135. 9 8 1 100 2 3 4 5 6
  136. 9 8 1 100 2 3 4 5 6 200
  137. 9 8 1 2 3 4 5 6 200
  138. 8 1 2 3 4 5 6 200
  139. 8 1 2 3 4 5 6
  140. """

链表与顺序表的对比

链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。

链表与顺序表的各种操作复杂度如下所示:

操作 链表 顺序表
访问元素 O(n) O(1)
在头部插入/删除 O(1) O(n)
在尾部插入/删除 O(n) O(1)
在中间插入/删除 O(n) O(n)

注意虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行。

Python实现单项链表的更多相关文章

  1. c++刷题(27/100)反转单项链表,链表的倒数第k个

    题目1:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位 ...

  2. Python实现单链表数据的添加、删除、插入操作

    Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...

  3. 关于c语言单项链表尾添加

    犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...

  4. 用python实现单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  5. python实现单链表反转(经典笔试题)

    https://blog.csdn.net/su_bao/article/details/81072849 0.说在前面的话 链表结构,说难不难,说易不易,一定要亲自编程实现一下.其次就是一定要耐心, ...

  6. python实现单链表的翻转

    #!/usr/bin/env python #coding = utf-8 class Node:     def __init__(self,data=None,next = None):      ...

  7. python数据结构之链表(一)

    数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟 ...

  8. 用Python写单向链表和双向链表

    链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...

  9. python实现单链表的反转

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/env python #coding = utf-8 ...

  10. python描述:链表

    单链表结构: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点 ...

随机推荐

  1. cmd中pip加速的方法

    临时加速: pip install dlib -i https://pypi.tuna.tsinghua.edu.cn/simple/ 永久加速: 在user文件夹里新建pip文件夹,再建pip.in ...

  2. element-ui el-table 多选和行内选中

    <template> <div style="width: 100%;height: 100%;padding-right: 10px"> <el-t ...

  3. .NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json

    微软终于追上了? 图片来自 Glenn Carstens-Peters Unsplash 欢迎来到.NET性能系列的另一章.这个系列的特点是对.NET世界中许多不同的主题进行研究.基准和比较.正如标题 ...

  4. 详解pyautogui模块

    一.安装 pip install pyautogui 或者 pip install -i  https://pypi.tuna.tsinghua.edu.cn/simple pyautogui 二.全 ...

  5. Linux系统部署Jenkins

    搭建Jenkins,准备搞一个定时任务来自动部署服务.做个记录. 问题写在前头:①建议使用最新版的Jenkins版本,jdk版本要跟Jenkins版本对应(有要求):②最好使用war包部署Jenkin ...

  6. Oracle数据库允许最大连接数

    1.查看当前的数据库连接数 SQL> select count(*) from v$process ; 2.数据库允许的最大连接数 SQL> select value from v$par ...

  7. 8.drf-序列化器

    在序列化类中,如果想使用request,则可以通过self.context['request']获取 序列化器的主要由两大功能 - 对请求的数据进行校验(底层调用的是Django的Form和Model ...

  8. cookie中 防止重复存值 (可用于历史记录等)

    function makeCookie($key,$val){ // 查看cookie中是否已经存过键为history_ids if(Cookie::has($key)){ // 已经存过了 $jso ...

  9. 基于python的数学建模---时间序列

    JetRail高铁乘客量预测--7种时间序列方法 数据获取:获得2012-2014两年每小时乘客数量 import pandas as pd import numpy as np import mat ...

  10. i春秋include

    打开题目,发现它提示我们有个phpinfo.php,所以我们直接访问,没有什么特殊的发现,根据题目提示include,找到allow_url_include的信息 (ctrl+f直接进入网页搜索) 发 ...