单向链表定义

单向链表(Single Linked List)也叫单链表,是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素,是链表中最简单的一种形式。链表中的数据是以结点来表示的,每个节点包含两个域,一个元素域(数据元素的映象)和一个链接域,链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

节点示意图

单向链表示意图

单向链表的基本操作

  • is_empty() 判断链表是否为空
  • length 链表长度
  • travel() 遍历整个链表,打印元素
  • add(item) 在链表头部添加元素
  • append(item) 在链表尾部添加元素
  • insert(pos, item) 在指定位置插入元素
  • remove(item) 删除元素
  • clear() 清空链表
  • is_contain(item) 判断元素是否存在

Python代码实现

# 节点的实现class Node(object):"""单链表的结点"""def __init__(self,item):# _item存放数据元素self.item = item# _next是下一个节点的标识self.next = None
# 单向链表的实现class SingleLinkList(object):"""单链表"""def __init__(self):self._head = Nonedef is_empty(self):"""判断链表是否为空"""return self._head is None@propertydef length(self):"""链表长度"""# cur初始时指向头节点cur = self._headcount = 0# 尾节点指向None,当未到达尾部时while cur is not None :count += 1# 将cur后移一个节点cur = cur.nextreturn countdef travel(self):"""遍历链表"""cur = self._headwhile cur is not None :print(cur.item)cur = cur.nextprint("")def add(self, item):"""头部添加元素"""# 先创建一个保存item值的节点node = Node(item)# 将新节点的链接域next指向头节点,即_head指向的位置node.next = self._head# 将链表的头_head指向新节点self._head = nodedef append(self, item):"""尾部添加元素"""node = Node(item)# 先判断链表是否为空,若是空链表,则将_head指向新节点if self.is_empty():self._head = node# 若不为空,则找到尾部,将尾节点的next指向新节点else:cur = self._headwhile cur.next is not None :cur = cur.nextcur.next = nodedef insert(self, pos, item):"""指定位置添加元素"""# 若指定位置pos为第一个元素之前,则执行头部插入if pos <= 0:self.add(item)# 若指定位置超过链表尾部,则执行尾部插入elif pos > (self.length-1):self.append(item)# 找到指定位置else:node = Node(item)count = 0# pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置pre = self._headwhile count < (pos-1):count += 1pre = pre.next# 先将新节点node的next指向插入位置的节点node.next = pre.next# 将插入位置的前一个节点的next指向新节点pre.next = nodedef remove(self,item):"""删除节点"""cur = self._headpre = Nonewhile cur is not None :# 找到了指定元素if cur.item == item:# 如果第一个就是删除的节点if not pre:# 将头指针指向头节点的后一个节点self._head = cur.nextelse:# 将删除位置前一个节点的next指向删除位置的后一个节点pre.next = cur.nextbreakelse:# 继续按链表后移节点pre = curcur = cur.nextdef is_contain(self,item):"""链表查找节点是否存在,并返回True或者False"""cur = self._headwhile cur is not None :if cur.item == item:return Truecur = cur.nextreturn Falsedef __len__(self):"""可以使用len()方法获取链表长度"""return self.lengthdef __iter__(self):"""可使用循环遍历链表里的元素"""cur = self._headwhile cur is not None:value = cur.itemcur = cur.nextyield valuedef __contains__(self, item):"""可使用in判断是否在链表中"""cur = self._headwhile cur is not None :if cur.item == item:return Truecur = cur.nextreturn False
# 测试数据if __name__ == '__main__':print("--------创建单向链表---------")sl_list = SingleLinkList()sl_list.add(1)sl_list.add(2)sl_list.append(3)sl_list.insert(2, 4)print("length:",len(sl_list))sl_list.travel()print(sl_list.is_contain(3))print(sl_list.is_contain(5))print(3 in sl_list)print(5 in sl_list)sl_list.remove(1)print("length:",len(sl_list))sl_list.travel()print("--------循环遍历-------")for i in sl_list:print(i)
# 输出结果--------创建单向链表---------
length: 4
2
1
4
3True
False
True
False
length: 3
2
4
3--------循环遍历-------
2
4
3

算法分析

操作 复杂度
访问元素 O(n)O(n)O(n)
在头部插入/删除 O(1)O(1)O(1)
在尾部插入/删除 O(n)O(n)O(n)
在中间插入/删除 O(n)O(n)O(n)

联系我们

个人博客网站:http://www.bling2.cn/

Github地址:https://github.com/lb971216008/Use-Python-to-Achieve

知乎专栏:https://zhuanlan.zhihu.com/Use-Python-to-Achieve

小专栏:https://xiaozhuanlan.com/Use-Python-to-Achieve

博客园:https://www.cnblogs.com/Use-Python-to-Achieve

python实现·数据结构与算法之单向链表相关推荐

  1. python数据结构与算法:单向链表

    单链表:python实现及其对应的 增删查检 操作 ##################### P4.1-P4.8 单向链表 ########################### #coding:u ...

  2. java 快速从树节点找到数据_数据结构与算法:单向链表和双向链表

    一.链表简介 1.链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列节点组成,节点可以在运行时动态生成,节点包括两个部分:一个 ...

  3. Java数据结构与算法-SingleLinkedList单向链表插入,删除,查找,修改详解及代码

    SingleLinkedList单向链表插入,删除,查找,修改详解及代码 单向链表学习目标 1. 链表的介绍 2. 单向链表的存储特点以及原理 3. 基本操作:插入,删除等 4. 单向链表应用场景举例 ...

  4. 【数据结构与算法】单向链表的实现

  5. C语言随笔小算法:单向链表

    C语言随笔小算法:单向链表 参考链接: 代码参考:https://blog.csdn.net/go_sann/article/details/80508284 原理参考:https://blog.cs ...

  6. java数据结构与算法之双链表设计与实现

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: java数据结 ...

  7. Python版本的数据结构书_《用Python解决数据结构与算法问题》

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  8. 数据结构与算法:企业级链表实现(超详细)

    企业级链表介绍 如果我们使用原始的C语言写链表的话,数据类型是被固定死的,如果业务换了 需要另一种数据类型,我们又得重新在写一个链表,当然我们可以使用void* 万能指针,因为void* 可以接受任意 ...

  9. 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)

    前言 C语言的指针真的很强大,万能指针更强大,可以指向任意类型的数据.在上篇博客 数据结构与算法:单链表(超详细实现)中用C语言实现了单链表的相关算法,不过却有局限性 只能针对某一种数据类型还是不够强 ...

  10. 数据结构与算法之单链表

    数据结构与算法之单链表 //链表的实现/*实现单链表的 构建.数据添加.数据删除(返回元素所在位置).数据查找(返回元素所在的位置)的算法设计:*/ //链表的实现/*实现单链表的 构建.数据添加.数 ...

最新文章

  1. PyTorch 图像分类
  2. DJANGO获取用户访问IP
  3. 企业官网建设搞清三个定位
  4. break 与 continue
  5. scrapy-splash抓取动态数据例子十三
  6. 2017.10.25笔记3
  7. CSDN粉丝可见回来了!
  8. random and password 在Linux下生成crypt加密密码的方法,shell 生成指定范围随机数与随机字符串...
  9. asp.net core封装layui组件示例分享
  10. 【学习笔记】线性规划与对偶问题和LP对偶费用流([ZJOI2013]防守战线题解)
  11. 为了杀蚊子,他用树莓派DIY了一把激光枪!
  12. php byte stringbuffer,重拾java基础(十三):String姐妹StringBuffer、StringBuilder总结
  13. const char *转wstring 方法
  14. 红黑树插入和删除的各种情况分析
  15. [IDDFS+背包] 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring
  16. mysql定制化_【MySQL技巧】定制你的MySQL命令行
  17. 分享一个棋力很强的象棋应用和一个强大的开局库
  18. 常见音频编码格式总结
  19. 情景式领导力学习(2) - 实践案例及思考
  20. 用java制作扑克牌_java实现简单扑克牌游戏

热门文章

  1. ISAPI_Rewrite
  2. 基于51单片机的教室人数检测
  3. 计算机共享访问权限,设置电脑共享权限、电脑文件共享权限设置、设置共享文件夹访问权限的方法...
  4. h5页面制作软件html包,iH5专业H5页面制作工具网页版
  5. 计算机输入什么指令关机,电脑自动关机命令是什么
  6. maven仓库repositories和mirrors的配置及区别详解(轻松搞明白)
  7. 为什么互联网公司崇尚扁平化管理?
  8. 五大理由!建议你选择中国电信 CTWing 物联网平台?
  9. 软件工程专业和网络工程专业的区别
  10. mysql省市区数据导入_最新行政区划省市区镇街道 导入数据库 MYSQL (2020年8月 )