1.  

单链表的操作

  1.  
  • is_empty() 链表是否为空
  • length() 链表长度
  • travel() 遍历整个链表
  • add(item) 链表头部添加元素
  • append(item) 链表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 删除节点
  • search(item) 查找节点是否存在
  1. class SingleNode(object):
  2. """单链表的结点"""
  3. def __init__(self,item):
  4. # _item存放数据元素
  5. self.item = item
  6. # _next是下一个节点的标识
  7. self.next = None
  8.  
  9. class SingleLinkList(object):
  10. """单链表"""
  11. def __init__(self):
  12. self._head = None
  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 = 0
  23. # 尾节点指向None,当未到达尾部时
  24. while cur != None:
  25. count += 1
  26. # 将cur后移一个节点
  27. cur = cur.next
  28. return count
  29.  
  30. def travel(self):
  31. """遍历链表"""
  32. cur = self._head
  33. while cur != None:
  34. print (cur.item)
  35. cur = cur.next
  36. print ("")
  37.  
  38. def add(self, item):
  39. """头部添加元素"""
  40. # 先创建一个保存item值的节点
  41. node = SingleNode(item)
  42. # 将新节点的链接域next指向头节点,即_head指向的位置
  43. node.next = self._head
  44. # 将链表的头_head指向新节点
  45. self._head = node
  46.  
  47. def append(self, item):
  48. """尾部添加元素"""
  49. node = SingleNode(item)
  50. # 先判断链表是否为空,若是空链表,则将_head指向新节点
  51. if self.is_empty():
  52. self._head = node
  53. # 若不为空,则找到尾部,将尾节点的next指向新节点
  54. else:
  55. cur = self._head
  56. while cur.next != None:
  57. cur = cur.next
  58. cur.next = node
  59.  
  60. def insert(self, pos, item):
  61. """指定位置添加元素"""
  62. # 若指定位置pos为第一个元素之前,则执行头部插入
  63. if pos <= 0:
  64. self.add(item)
  65. # 若指定位置超过链表尾部,则执行尾部插入
  66. elif pos > (self.length()-1):
  67. self.append(item)
  68. # 找到指定位置
  69. else:
  70. node = SingleNode(item)
  71. count = 0
  72. # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置
  73. pre = self._head
  74. while count < (pos-1):
  75. count += 1
  76. pre = pre.next
  77. # 先将新节点node的next指向插入位置的节点
  78. node.next = pre.next
  79. # 将插入位置的前一个节点的next指向新节点
  80. pre.next = node
  81.  
  82. def remove(self,item):
  83. """删除节点"""
  84. cur = self._head
  85. pre = None
  86. while cur != None:
  87. # 找到了指定元素
  88. if cur.item == item:
  89. # 如果第一个就是删除的节点
  90. if not pre:
  91. # 将头指针指向头节点的后一个节点
  92. self._head = cur.next
  93. else:
  94. # 将删除位置前一个节点的next指向删除位置的后一个节点
  95. pre.next = cur.next
  96. break
  97. else:
  98. # 继续按链表后移节点
  99. pre = cur
  100. cur = cur.next
  101. def search(self,item):
  102. """链表查找节点是否存在,并返回True或者False"""
  103. cur = self._head
  104. while cur != None:
  105. if cur.item == item:
  106. return True
  107. cur = cur.next
  108. return False
  109.  
  110. if __name__ == "__main__":
  111. ll = SingleLinkList()
  112. ll.add(1)
  113. ll.add(2)
  114. ll.append(3)
  115. ll.insert(2, 4)
  116. print ("length:",ll.length())
  117. ll.travel()
  118. print (ll.search(3))
  119. print (ll.search(5))
  120. ll.remove(1)
  121. print ("length:",ll.length())
  122. ll.travel()

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

  1. Python 单向链表、双向链表

    用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...

  2. Python单向链表的实现

    链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序.每个结构含有表元素和指向后继元素的指针.最后一个单元的指针指向NULL.为了方便链表的删除与插入操作,可以为链表添加一个表头. 删除操作 ...

  3. python 单向链表

    import sys import random class employee: def __init__(self): self.num= self.salary= self.name='' sel ...

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

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

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

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

  6. 用python实现单向链表

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

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

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

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

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

  9. python中的单向链表实现

    引子 数据结构指的是是数据的组织的方式.从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式. 为什么需要链表? 顺序表的构建需要预先知道数据大小来申请连续的存储空间 ...

随机推荐

  1. Babel 安装教程

    Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. 这意味着,你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持.下面是一个例子. // 转码前 inpu ...

  2. jsp学习笔记之:内置对象

    application对象: 设置一个名为name,值为val的应用内共享的数据 <% application.setAttribute("name",val); %> ...

  3. 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独

    题面 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出 ...

  4. 【CJOJ2484】【Luogu2805】最小函数值(函数最小值)

    题面 Description 有n个函数,分别为F1,F2,...,Fn.定义 Fi(x)=Aix2+Bix+Ci(x∈N∗)Fi(x)=Aix2+Bix+Ci(x∈N∗) .给定这些Ai.Bi和Ci ...

  5. 【THUWC 2017】在美妙的数学王国中畅游

    数学王国里有n座城市,每座城市有三个参数\(f\),\(a\),\(b\),一个智商为\(x\)的人经过一座城市的获益\(f(x)\)是 若\(f=1\),则\(f(x)=\sin(ax+b)\): ...

  6. Spring AOP梳理

    一.Srping AOP AOP(Aspect Oriented Programming)解释为面向切面编程,何为切面,用刀把一块面包切成两半,刀切下去形成的面就叫切面,那么面向切面的就是形成切面的这 ...

  7. c# ffmpeg视频转换【转载】

    c#  ffmpeg视频转换 什么是ffmpeg,它有什么作用呢,怎么可以使用它呢,带着问题去找答案吧!先参考百度百科把,我觉得它很强大无奇不有,为了方便大家我就把链接提供了! http://baik ...

  8. 【python学习笔记】5.条件、循环和其他语句

    [python学习笔记]5.条件.循环和其他语句 print: 用来打印表达式,不管是字符串还是其他类型,都输出以字符串输出:可以通过逗号分隔输出多个表达式 import: 导入模块     impo ...

  9. JS 装饰器解析

    随着 ES6 和 TypeScript 中类的引入,在某些场景需要在不改变原有类和类属性的基础上扩展些功能,这也是装饰器出现的原因. 装饰器简介 作为一种可以动态增删功能模块的模式(比如 redux ...

  10. 消息队列的使用 RabbitMQ

    RabbitMQ 是一款开源且比较流行的消息中间件.但用起来还是比较麻烦,有人封装了一层, 这就是 EasyNetQ . 一.安装 1.安装 Erlang: http://www.erlang.org ...