引子

数据结构指的是是数据的组织的方式。从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式。

为什么需要链表?  

顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。

链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。

什么是单链表?

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

单链表应当支持哪些基本操作?

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

操作图解:

add

insert

remove

 

代码实现

注意点:

因为没有计数,因此诸多操作都离不开遍历,何时停止不可迷糊。另外,不要忘记经常要考虑的特殊情况。如果为空会如何?如果链表中只有一个节点会如何?构造新链时,该遵循怎样的顺序?(先保证原链不断)

  1. class Node(object):
  2. def __init__(self, value):
  3. # 元素域
  4. self.value = value
  5. # 链接域
  6. self.next = None
  7.  
  8. class LinkedListOneway(object):
  9. def __init__(self, node=None):
  10. self.__head = node
  11.  
  12. def __len__(self):
  13. # 游标,用来遍历链表
  14. cur = self.__head
  15. # 记录遍历次数
  16. count = 0
  17. # 当前节点为None则说明已经遍历完毕
  18. while cur:
  19. count += 1
  20. cur = cur.next
  21. return count
  22.  
  23. def is_empty(self):
  24. # 头节点不为None则不为空
  25. return self.__head == None
  26.  
  27. def add(self, value):
  28. """
  29. 头插法
  30. 先让新节点的next指向头节点
  31. 再将头节点替换为新节点
  32. 顺序不可错,要先保证原链表的链不断,否则头节点后面的链会丢失
  33. """
  34. node = Node(value)
  35. node.next = self.__head
  36. self.__head = node
  37.  
  38. def append(self, value):
  39. """尾插法"""
  40. node = Node(value)
  41. cur = self.__head
  42. if self.is_empty():
  43. self.__head = node
  44. else:
  45. while cur.next:
  46. cur = cur.next
  47. cur.next = node
  48.  
  49. def insert(self, pos, value):
  50. # 应对特殊情况
  51. if pos <= 0:
  52. self.add(value)
  53. elif pos > len(self) - 1:
  54. self.append(value)
  55. else:
  56. node = Node(value)
  57. prior = self.__head
  58. count = 0
  59. # 在插入位置的前一个节点停下
  60. while count < (pos - 1):
  61. prior = prior.next
  62. count += 1
  63. # 先将插入节点与节点后的节点连接,防止链表断掉,先链接后面的,再链接前面的
  64. node.next = prior.next
  65. prior.next = node
  66.  
  67. def remove(self, value):
  68. cur = self.__head
  69. prior = None
  70. while cur:
  71. if value == cur.value:
  72. # 判断此节点是否是头节点
  73. if cur == self.__head:
  74. self.__head = cur.next
  75. else:
  76. prior.next = cur.next
  77. break
  78. # 还没找到节点,有继续遍历
  79. else:
  80. prior = cur
  81. cur = cur.next
  82.  
  83. def search(self, value):
  84. cur = self.__head
  85. while cur:
  86. if value == cur.value:
  87. return True
  88. cur = cur.next
  89. return False
  90.  
  91. def traverse(self):
  92. cur = self.__head
  93. while cur:
  94. print(cur.value)
  95. cur = cur.next

python中的单向链表实现的更多相关文章

  1. python中的单向循环链表实现

    引子 所谓单向循环链表,不过是在单向链表的基础上,如响尾蛇般将其首尾相连,也因此有诸多类似之处与务必留心之点.尤其是可能涉及到头尾节点的操作,不可疏忽. 对于诸多操所必须的遍历,这时的条件是什么?又应 ...

  2. python数据结构链表之单向链表

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

  3. Python链表的实现与使用(单向链表与双向链表)

    参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...

  4. 用python实现单向链表

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

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

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

  6. python数据结构——单向链表

    链表 ( Linked List ) 定义:由许多相同数据类型的数据项按照特定顺序排列而成的线性表. 特点:各个数据在计算机中是随机存放且不连续. 优点:数据的增删改查都很方便,当有新的数据加入的时候 ...

  7. python中的数据结构-链表

    一.什么是链表 链表是由一系列节点构成,每个节点由一个值域和指针域构成,值域中存储着用户数据,指针域中存储这指向下一个节点的指针.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环 ...

  8. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  9. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

随机推荐

  1. jQuery的一些基本的函数和用jQuery做一些动画操作

    jQuery是对js的封装,因为js有一些不方便的地方.所以,jQuery才会去对js进行封装. jQuery对于标签元素的获取 $('div')或$('li') <!DOCTYPE html& ...

  2. E: Unable to locate package clang-7 E: Unable to locate package clang++-7 E: Couldn't find any package by regex 'clang++-7'

    我的系统是Debian 9.8, 然后在装下面这两个包的时候老是提示找不到.然后再github上一问,过了几分钟就有大佬回复了,而且亲测有效 ~$ sudo apt-get -y install cl ...

  3. 通用RSA加密 - PHP+Java+Javascript加密解密

    php端生成 公钥私钥 1.openssl genrsa -out rsa_private_key.pem 1024    私钥 2.openssl rsa -in rsa_private_key.p ...

  4. SHOT

  5. 理解 Linux 的硬链接与软链接【转】

    转自:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html 从 inode 了解 Linux 文件 ...

  6. 2019 icpc南昌全国邀请赛-网络选拔赛J题 树链剖分+离线询问

    链接:https://nanti.jisuanke.com/t/38229 题意: 给一棵树,多次查询,每次查询两点之间权值<=k的边个数 题解: 离线询问,树链剖分后bit维护有贡献的位置即可 ...

  7. I/O多路复用之select、poll、epoll

    很早之前有写过篇IO多路复用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 参考链接:https://segm ...

  8. Android 插件化和热修复知识梳理

    概述 在Android开发中,插件化和热修复的话题越来越多的被大家提及,同时随着技术的迭代,各种框架的发展更新,插件化和热修复的框架似乎已经日趋成熟,许多开发者也把这两项技术运用到实际开发协作和正式的 ...

  9. 利用 Google Chart API 生成二维码大小不一致

    大小不一致是由于 chl  参数内容不一样导致的,而 chs 参数只能指定生成图片的大小,不能指定生成具体二维码大小. 比如:https://chart.googleapis.com/chart?ch ...

  10. TensorFlow object detection API

    cloud执行:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_pet ...