目录

  • 1 单链表
    • 节点实现
    • 单链表操作
    • 单链表实现
    • 测试
    • 链表与顺序表对比
  • 2 单向循环链表
    • 操作
    • 实现
    • 测试
  • 3 双向链表
    • 操作
    • 实现
    • 测试

1 单链表

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

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

节点实现

class SingleNode(object):"""单链表的结点"""def __init__(self,item):# _item存放数据元素self.item = item# _next是下一个节点的标识self.next = None

单链表操作

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

单链表实现

class SingleLinkList(object):#单链表def __init__(self,node=None):#初始时候头指向为空,也就是先生成一个空的链表self.__head=nodedef is_empty(self):#判断是否为空return self.__head==Nonedef length(self):#输出链表的长度#定义一个指针进行遍历cur=self.__headcount=0while cur!=None:count+=1cur=cur.nextreturn countdef travel(self):#遍历整个链表cur=self.__headwhile cur != None:print(cur.elem,end=" ")cur=cur.nextprint('')def add(self,item):#头部插入node=SingleNode(item)#方法一:头后插入if self.is_empty():self.__head=nodeelse:p=self.__headself.__head=nodenode.next=p# #方法二:重置头# node.next=self.__head# self.__head=nodedef insert(self,pos,item):#指定位置插入   pos从零开始索引node = SingleNode(item)if pos<=0:self.add(item)elif pos > self.length():self.append(item)else:pre = self.__headcount = 0while count<(pos-1):#当循环退出后,指向pos-1位置count += 1pre = pre.nextnode.next=pre.nextpre.next = nodedef append(self,item):#尾端加入node=SingleNode(item)if self.is_empty():self.__head=nodeelse:cur=self.__headwhile cur.next != None:cur=cur.nextcur.next=nodedef remove(self,item):cur = self.__headpre=Nonewhile cur != None:if cur.elem == item:#先判断是否事头节点if cur == self.__head:self.__head=cur.nextelse:pre.next=cur.nextbreakelse:pre = curcur = cur.nextdef search(self,item):#查找cur=self.__headwhile cur!=None:if cur.elem==item:return Trueelse:cur=cur.nextreturn False

测试

链表与顺序表对比

链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。链表与顺序表的各种操作复杂度如下所示:

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

2 单向循环链表

单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。

操作

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

实现

class Node(object):#节点def __init__(self,elem):self.elem=elemself.next=Noneclass SingleCycleLinkList(object):#单项循环列表def __init__(self,node=None):#初始时候头指向为空,也就是先生成一个空的链表self.__head=nodeif node:node.next=nodedef is_empty(self):#判断是否为空return self.__head==Nonedef length(self):#输出链表的长度if self.is_empty():return 0#定义一个指针进行遍历cur=self.__headcount=1while cur.next!=self.__head:count+=1cur=cur.nextreturn countdef travel(self):#遍历整个链表if self.is_empty():returncur=self.__headwhile cur.next!=self.__head:print(cur.elem,end=" ")cur=cur.next#退出循环,cur指向尾节点,但尾节点的元素未打印print(cur.elem)def add(self,item):#头部插入node=Node(item)if self.is_empty():self.__head=nodenode.next=nodeelse:cur = self.__headwhile cur.next != self.__head:cur = cur.next# 退出循环,cur指向尾节点,node.next=self.__headcur.next=nodeself.__head=nodedef insert(self,pos,item):#指定位置插入   pos从零开始索引node = Node(item)if pos<=0:self.add(item)elif pos > self.length():self.append(item)else:pre = self.__headcount = 0while count<(pos-1):#当循环退出后,指向pos-1位置count += 1pre = pre.nextnode.next=pre.nextpre.next = nodedef append(self,item):#尾端加入node=Node(item)if self.is_empty():self.__head=nodenode.next=nodeelse:cur=self.__headwhile cur.next !=self.__head:cur=cur.nextcur.next=nodenode.next=self.__headdef remove(self,item):#删除节点if self.is_empty():returncur = self.__headpre=Nonewhile cur.next != self.__head:if cur.elem == item:#先判断是否事头节点if cur == self.__head:#头节点的情况#先找的尾节点rear=self.__headwhile rear.next!=self.__head:rear=rear.nextself.__head=cur.nextrear.next=self.__headelse:#中间节点pre.next=cur.nextreturnelse:pre = curcur = cur.next# 退出循环,cur指向尾节点if cur.elem==item:if cur==self.__head:#链表只有一个节点self.__head=Nonepre.next = cur.nextdef search(self,item):#查找if self.is_empty():return Falsecur=self.__headwhile cur.next!=self.__head:if cur.elem==item:return Trueelse:cur=cur.nextif cur.elem == item:return Truereturn False

测试

3 双向链表

每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。

操作

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

实现

class Node(object):#节点def __init__(self,item):self.elem=itemself.next=Noneself.prev=Noneclass DoubleLinkList(object):#双链表def __init__(self,node=None):#初始时候头指向为空,也就是先生成一个空的链表self.__head=nodedef is_empty(self):#判断是否为空return self.__head is Nonedef length(self):#输出链表的长度#定义一个指针进行遍历cur=self.__headcount=0while cur!=None:count+=1cur=cur.nextreturn countdef travel(self):#遍历整个链表cur=self.__headwhile cur != None:print(cur.elem,end=" ")cur=cur.nextprint('')def add(self,item):#头部插入node=Node(item)node.next=self.__headself.__head=nodenode.next.prev=node# node.next=self.__head# self.__head.prev=node# self.__head=nodedef insert(self,pos,item):#指定位置插入   pos从零开始索引node = Node(item)if pos<=0:self.add(item)elif pos > self.length():self.append(item)else:cur=self.__headcount = 0while count<pos:count += 1cur = cur.next#当循环退出后,cur就是指向pos这个位置node.next=curnode.prev=cur.prevcur.prev.next=nodecur.prev=nodedef append(self,item):#尾端加入node=Node(item)if self.is_empty():self.__head=nodeelse:cur=self.__headwhile cur.next != None:cur=cur.nextcur.next=nodenode.prev=curdef remove(self,item):cur = self.__headwhile cur != None:if cur.elem == item:#先判断是否事头节点if cur == self.__head:self.__head=cur.next#判断链表是否只有一个节点if cur.next:cur.next.prev=Noneelse:cur.prev.next=cur.nextif cur.next:cur.next.prev=cur.prevbreakelse:cur = cur.nextdef search(self,item):#查找cur=self.__headwhile cur!=None:if cur.elem==item:return Trueelse:cur=cur.nextreturn False

测试

链表——单链表、单向循环链表、双向链表相关推荐

  1. 建立单链表 单链表的插入_单链列表插入

    建立单链表 单链表的插入 All possible cases: 所有可能的情况: Inserting at beginning 开始插入 Inserting at the ending 在末尾插入 ...

  2. 数据结构上机-尾、头插法建立单链表-单链表遍历C语言完整代码实现

    点击此处跳转视频链接:数据结构上机-尾.头插法建立单链表-单链表遍历C语言完整代码实现

  3. 数据结构与算法笔记(三)—— 链表(单链表、循环链表、双向链表)

    一.前沿 1.1.为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活. 链表结构可以充分利用计算机内存空间,实现灵活的内 ...

  4. 基于QT实现的可视化链表(单链表、循环链表、双向链表)

    1.1 题目 题号1:分别以单链表.循环链表.双向链表为例,实现线性表的建立.插入.删除.查找等基本操作. 要求:能够把建立.插入.删除等基本操作的过程随时显示输出来. 1.2 软件功能 功能分为三个 ...

  5. 数据结构之 链表( 单链表, 双链表,循环链表)

    前篇.链表的概括 1.链表(Linked list)说明 是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按 ...

  6. 数据结构之链表--单链表

    Hello,大家好!好久不见了,之前一直在忙于一些琐事,最近半个月内会将数据结构的各种数据结构实现出来,一个挺有意思的东西. 这次我将要介绍的是链表.链表有单链表,单向循环链表,双向链表,双向循环链表 ...

  7. 【编程2】单链表+单链表反转(LeetCode. 206)

    文章目录 一.链表 二.单链表 1.基本概念 (1)单链表 (2)头指针--必有元素 (3)头结点--非必需元素 (4)尾结点 2.查找操作 3.插入操作 4.删除操作 三.设计思想-- 时间 < ...

  8. 数据结构-链表-单链表(java实现)

    今天和大家分享数据结构中链表的相关知识.在数据结构中有线性结构和非线性结构两种类别的区分,虽然链表属于线性结构是有序的列表,但是它在内存中却是不连续的. 关于数组和链表的优缺点. 数组静态分配内存,链 ...

  9. c++ 链表_算法学习笔记 - 链表 - 单链表的粗糙实现

    常用的链表有单链表.双链表.循环链表. 概念看得再多,理解得再多,也不一定能够写得出来.所以动动手,多练习才是提升能力的关键. 有朋友留言说道:建议大家在实现之前的思考时间不要太长.一是先用自己能想到 ...

最新文章

  1. pythonscrapy爬虫_Python 爬虫:Scrapy 实例(二)
  2. Java 连接 MS sql Server 2005
  3. ldifde 神奇功效,对付英文系统下显示中文乱码哦
  4. ubuntu12下subversion 1.6升级为1.8版本
  5. 刷脸考勤,重新定位校园管理
  6. linux c++ 函数效率,C++高精度性能测试函数
  7. phpstudy运行PHP项目出现404怎么办?
  8. 全球顶级开源大神们现身 COSCon‘20
  9. 【CSS】 CSS基础知识 属性和选择
  10. SpringBoot连接Gbase数据库
  11. CentOS 7查看源代码
  12. unity lookat导致物体颠倒怎么解决_在Unity 2D中如何用一行代码实现LookAt的效果,以及向量归一化小总结...
  13. 【Python】把excel文件中的数据转化为字典格式存起来
  14. 莫纳什大学计算机硕士专业怎么样,澳大利亚留学:莫纳什大学计算机硕士的14个专业...
  15. android studio lambda插件,Android studio配置lambda表达式教程
  16. Quantopian 做空恐慌指数回测
  17. 安装黑群晖不求人,arpl在线编译安装群晖教程
  18. 【个人博客】Astro 快速搭建个人博客
  19. 备忘录怎么用红笔标注_如何高效的使用苹果产品的备忘录、提醒事项、日历?...
  20. 配置网络,安装docker

热门文章

  1. python 保存文件 吃内存_python检测空间储存剩余大小和指定文件夹内存占用的实例...
  2. 常见python爬虫框架_常用高效的Python爬虫框架
  3. AcWing1069.凸多边形的划分(区间DP)题解
  4. P4 数据记录增删查改操作
  5. PicoDet的学习笔记
  6. 《南溪的目标检测学习笔记》——DCN(DCNv2)的学习笔记
  7. Singularity将本地SIF文件,转成sandbox
  8. ESP32烧录bin,乐鑫下载工具使用flash_download_tool
  9. VMware16安装CentOS7.6虚拟机
  10. 计算机基础【面试遇到】