python3实现链表的基础操作


实现的步骤:

一、建立链表模型

二、遍 历 链 表

三、获取链表长度

四、追 加 节 点

五、插 入 操 作

六、主 调 函 数

分析:

(1)建立链表模型:

首先我们节点的概念如图中的单个方块(代码实现):
class linkNode():"""链表节点类"""def __init__(self,date):self.date=dateself.next=None
其次我们脑子里应该有一下的链表模型

那么要想实现这个模型我们可以用以下的代码来实现:
lass sigLink():"""self.length   用于记录链表的长度self.head     链表的头部self.tail     记录链表的尾部"""def __init__(self,item):"""item   一位数组,存放改链表的数组"""self.length=len(item)if self.length<=0:returni=0self.head=linkNode(item[i])self.tail=self.headi+=1###此句不能少while i<self.length:self.tail.next=linkNode(item[i])self.tail=self.tail.nexti+=1

注意:(1)__ init__(self,item)是自动调用的,只要有sigLink这一实例化对象就会执行的,
(2)item这一参数可以在实例化时传入一个列表。
(3)i+=1记住一定不能忘记写!(笔者一开始就忘记写出现了没有预期的结果)

感兴趣的游客可以尝试把i+=1那行代码删去,看一下遍历结果会出现怎样的变化!

执行到这一步我们的链表的基本框架也就出来了!

(2)遍历链表:

当我们建立好链表以后,我们需要知道链表里面的数据,于是就需要遍历这一过程读取每一个节点的数据内容。这里我们需要一个p标记,就是完成遍历的关键
def printlink(self):"""正序打印该链表"""if self.head==None:print("该链表为空链表!")p=self.headwhile p!=None:print(p.date,end=" ")p=p.next

关键字end=“ ”可以用于将结果输出到同一行

图上的p的序号代表执行的顺序

(3)获取链表长度:

def getlength(self):"""获取链表的长度"""print("该链表的长度为:",self.length)

在sigLink类中我们已经知道链表的长度,因此只需要返回self.length即可

(4)追加节点:

def linkAppend(self,num):"""在链表尾部追加节点"""self.tail.next=linkNode(num)self.tail=self.tail.nextself.length+=1


先将要插入的数字转换为节点(linkNode(num)),然后将tail的next域指向linkNode(num),最后在将tail指向linkNode(num)即完成了追加这一功能

(5)插入操作:

插入时有四种情况:

(1)索引值大于链表的长度
(2)索引值等于0
(3)索引值刚好等于链表的长度(相当于追加)
(4)索引值在中间位置
针对(2),(4)两种情况 我画了一下的图形让游客理解。

def insertNode(self,index,num):"""在链表中间插入节点index:插入节点的序号num:插入点的值"""if index>self.length:print("index参数超出范围")returnif index==self.length:self.linkAppend(num)returnif index==0:p=linkNode(num)p.next=self.headself.head=pself.length+=1returnptemp=self.headwhile index>1:ptemp=ptemp.nextindex-=1p=linkNode(num)p.next=ptemp.nextptemp.next=pself.length+=1

(6)主调代码:

1、简单形式的:

a=sigLink([1,2,3,4])
a.printlink()
a.insertNode(2,10)#插入操作
print("\n")
a.printlink()#遍历操作
print("\n")
a.getlength()#获取长度
print("\n")
a.linkAppend(15)#追加节点
a.printlink()

2、复杂形式的:

a=[]
flag=""
NodeNum=int(input("请输入节点的个数:"))
for i in range(1,NodeNum+1):a.append(int(input("您输入的第%d个节点的值为:"%i)))Link=sigLink(a)
number=int(input("请你输入你要执行的次数:"))
i=0#标记次数
while i<number:operation=input("请输入你要进行的操作名称:")name=flag+str(operation)i+=1if name=="printlink":print("遍历的结果为:")Link.printlink()print("\n")elif name=="getlength":Link.getlength()elif name=="linkAppend":num=int(input("请输入你要追加的数字:"))Link.linkAppend(num)print("追加成功!")print("追加之后遍历的结果为:")Link.printlink()print("\n")elif name=="insertNode":Index=int(input("你要索引的位置为::"))NodeNum=int(input("你要在%d插入的数字:"%Index))Link.insertNode(Index,NodeNum)print("插入成功!")print("插入之后遍历的结果为:")print("\n")Link.printlink()if name!="printlink" or name!="getlength"or name!="linkAppend" or name!="insertNode":print("输入操作名称有误,请重新输入!")while i>=number:print("\n")print("执行次数已经达到,结束程序!")i=i-1

完整代码:


class linkNode():"""链表节点类"""def __init__(self,dat):self.dat=datself.next=None
class sigLink():"""self.length   用于记录链表的长度self.head     链表的头部self.tail     记录链表的尾部"""def __init__(self,item):"""item   一位数组,存放改链表的数组"""self.length=len(item)if self.length<=0:returni=0self.head=linkNode(item[i])self.tail=self.headi+=1###此句不能少while i<self.length:self.tail.next=linkNode(item[i])self.tail=self.tail.nexti+=1def printlink(self):"""正序打印该链表"""if self.head==None:print("该链表为空链表!")p=self.headwhile p!=None:print(p.dat,end=" ")p=p.nextdef getlength(self):"""获取链表的长度"""print("该链表的长度为:",self.length)def linkAppend(self,num):"""在链表尾部追加节点"""self.tail.next=linkNode(num)self.tail=self.tail.nextself.length+=1def insertNode(self,index,num):"""在链表中间插入节点index:插入节点的序号num:插入点的值"""if index>self.length:print("index参数超出范围")returnif index==self.length:self.linkAppend(num)returnif index==0:p=linkNode(num)p.next=self.headself.head=pself.length+=1returnptemp=self.headwhile index>1:ptemp=ptemp.nextindex-=1p=linkNode(num)p.next=ptemp.nextptemp.next=pself.length+=1a=[]
flag=""
NodeNum=int(input("请输入节点的个数:"))
for i in range(1,NodeNum+1):a.append(int(input("您输入的第%d个节点的值为:"%i)))Link=sigLink(a)
number=int(input("请你输入你要执行的次数:"))
i=0#标记次数
while i<number:operation=input("请输入你要进行的操作名称:")name=flag+str(operation)i+=1if name=="printlink":print("遍历的结果为:")Link.printlink()print("\n")elif name=="getlength":Link.getlength()elif name=="linkAppend":num=int(input("请输入你要追加的数字:"))Link.linkAppend(num)print("追加成功!")print("追加之后遍历的结果为:")Link.printlink()print("\n")elif name=="insertNode":Index=int(input("你要索引的位置为::"))NodeNum=int(input("你要在%d插入的数字:"%Index))Link.insertNode(Index,NodeNum)print("插入成功!")print("插入之后遍历的结果为:")print("\n")Link.printlink()if name!="printlink" or name!="getlength"or name!="linkAppend" or name!="insertNode":print("输入操作名称有误,请重新输入!")while i>=number:print("\n")print("执行次数已经达到,结束程序!")i=i-1

python3实现链表的基础操作相关推荐

  1. 单链表的基础操作(带头结点)

    链表(带头结点)的基础操作:(王道书的实现,附带main函数) 1.链表的初始化 2.头插法建立单链表 3.尾插法建立单链表 4.指定结点的前插 5.指定结点的后插 6.按位查询 7.按值查询 8.链 ...

  2. 数据结构单链表的基础操作(C语言)

    效果如图: 代码及详情如下:(文末总结) 目录 //主函数 //菜单 //创建链表 //插入结点 //删除结点 //查找结点 //链表长度 //打印链表 //清空链表 //逆置链表 //删除偶数元素结 ...

  3. 单链表的基础操作(头插法、尾插法、插入和删除)

    一.链表的建立(头插法和尾插法) 1.头插法:把后建立的结点插在头部.用这种方法建立起来的链表的实际顺序与输入顺序刚好向反,输出时为倒序! 下面附上代码: struct node *headcreat ...

  4. 单链表的基础操作练习

    对单链表的创建,查找,删除,添加. #include<stdio.h > #include<stdlib.h> struct link {int date;struct lin ...

  5. java链表需要自己编写么_基于java的链表基础操作

    链表结构是由一个或一个以上再内存上不连续存储的元素结点连接而成的数据结构,链表的每个结点都有两个部分,一个部分是存储的数据,另一部分是指向下一结点的指针,既是下一节点的引用. 首先链表一定有一个头结点 ...

  6. 链表基础操作 / 循环链表约瑟夫环/STL链表基本操作

    链表的基础操作 程序功能 输入几 就把几调到数最前面 程序步骤: 1.插入函数 2.初始化函数 3.删除节点 4.把排列展示出来 程序注意 不同函数的指针 不同 头指针定义为全局变量 代码实现截图 # ...

  7. 不带头结点的链表基础操作(初始化,增删改查)

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

  8. 【Python笔记】列表基础操作 :创建,增加、删除、查询。附加:练习题。用简单代码解释。

    Python:列表基础操作 创建,增加.删除.查询.附加练习题.用简单代码解释. 目录 Python:列表基础操作 演示环境 第一部分:列表(list) 1. 创建空列表 2. 创建只有默认值的列表 ...

  9. 【Linux】 Jetbot、Dofbot机器人如何创建、执行python脚本+Linux基础操作

    文章目录 一.Jetbot.dofbot机器人创建执行python脚本方法 1.1 引言 1.2 通过SSH协议传输文件 1.2.1 Mobaxterm的下载安装 1.2.2 Mobaxterm创建s ...

最新文章

  1. 拦截导弹(最长递增子序列)
  2. 李智:用数学来理解世界
  3. Bootstrap中实现图片圆角效果
  4. “刚毕业1年,做Python挣了60W!”网友:吹的不多..
  5. 弗尤博客(十一)之搜索博文
  6. 不依赖第三方环境和服务
  7. 网评计算机学校好,网评十大最痛苦专业:计算机、数学上榜
  8. 在unity商店中寻找资源_Unity资产商店:五月疯狂促销活动正在进行中!
  9. Java8新特性 方法引用(三)
  10. 判断一个字符串能否通过添加一个字符变成回文串
  11. linux基础-自查
  12. Java枚举的打印_如何在java中打印所有枚举值?
  13. Win10 一些常用快捷键
  14. word饼图如何画引导线_excle怎么画立体饼图/如何在饼形图中添加引导线(Excel)...
  15. Problem:机器翻译
  16. 计算机接口中的shl,西门子200的PLC中SHL和ROL的区别,还...-卓优商学问答
  17. C++ 类的设计规则
  18. 机器学习入门实践——线性回归模型(波士顿房价预测)
  19. 第三章 Opencv图像像素操作
  20. 人教社免费公布全学段教材电子版(附地址)

热门文章

  1. limits.conf 配置不生效问题排查
  2. 人工智能处理的几大基础任务、元宇宙和人工智能
  3. jQuery-简述篇
  4. 如何加快客户端更新脱机地址簿
  5. 2022央企施工企业加速推进数字化转型赋能高质量发展
  6. 1278:【例9.22】复制书稿(book)
  7. 在线文档查看器GroupDocs.Viewer 9月新版V17.9发布 | 附下载
  8. Linux ss命令使用
  9. dos环境c语言写串口程序,DOS下串口通信程序来传送文件的源代码(转)
  10. Redis3.0的主从、集群高可用