Python数据结构-----链表1.0(单链表的增删改查以及反转)
创始人
2024-06-02 04:28:02

目录

前言:

1.单链表

1.1简介

1.2 对比列表

2.单链表的创建

3.单链表的遍历

4.链表元素的查询

5.节点的删除

6.节点的插入

7.链表元素的修改

 8.链表的反转

9.全部代码


前言:

        前面我们在C语言学习过了数据结构中的链表,既然说到数据结构,那我们可以通过C语言的指针去灵活实现数据结构(链表,栈,队列,二叉树),这就会有人去问了,那Python又没有指针这种东西,如何去实现数据结构呢?别忘了,Python是有面对对象的,一切皆对象,每一个对象都是有一个'类指针',我们看不见也摸不着的。好了,这里就废话不多说了,一起来学习今天的内容吧---单链表

1.单链表

1.1简介

        单链表是数据结构中最简单的线性表,其每一个节点包含数据域(data)和指针域(next),数据域是用来存放内容的,指针域是用来连接下一个节点,也就是说单链表可以实现把一些毫无相关且不连续的空间连接到一起,实现多组数据存放的功能。如图所示:

1.2 对比列表

        在此之前我们学习过了列表,那列表是一种空间连续的数据容器,也可以实现多组数据的存放功能,这一点跟链表是一样的。二者最大的不同就是空间连续与不连续,当然,在相关操作中的复杂度也是有出入的

对比

1.按数据查找:

        按照顺序查找,列表与链表的时间复杂度是一样的 o(n)

2.按位置查找:

        列表的复杂度是 o(1)

        链表的复杂度是 o(n)

3.元素的插入:

        列表的复杂度是 o(n)

        链表的复杂度是 0(1)

4.元素的删除:

        列表的复杂度是 0(n)

        链表的复杂度是 0(1) 

2.单链表的创建

在Python中,一个链表是一个链表对象,其中每一个节点也是一个节点对象,要想实现链表,我们只需要把这些节点对象连接到一起,组合成链表对象就行了。

 节点对象的建立:

#建立节点对象
class Listnode(object):def __init__(self,data=0,next=None):self.data=dataself.next=next

链表对象的建立:

#建立节点对象
class Listnode(object):def __init__(self,data=0,next=None):self.data=dataself.next=next
#创建链表对象
class List(object):def __init__(self):#先定义头节点的实例化对象self.head=Nonedef create(self,alldata):#创建链表,alldata是表示一组数据self.head=Listnode(alldata[0]) #创建好头节点,把第一个数据给到头结点cur=self.head  #cur为移动指针for i in alldata[1:]:#根据数据的多少,依次创建后面的节点p=Listnode(i)cur.next=pcur=preturn self.head #返回一个这个实例化头节点

这样就实现了一个单链表的创建了,是不是很简单呢?

说明:注意这里建立了一个链表类对象,后面的链表增删改查等方法会放到这个链表类对象当中 

3.单链表的遍历

遍历一个链表,把里面的数据依次取出。

 接上:

#上面链表对象的创建等内容省略
#……………………#遍历链表def tarvel(self):if self.head: #先判断头结点是否为空p=self.headwhile p:print(p.data,end=' ')#依次输出数据p=p.nextprint('')else:return
li=List()
li.create([x for x in range(10)])
li.tarvel()
#输出结果:0 1 2 3 4 5 6 7 8 9 

4.链表元素的查询

输入一个元素值value,然后在链表查询这个元素的节点是否存在,如果存在就输出这个节点的位置,如果不存在就输出不存在 

 #前面内容接上……#链表元素的查询def select(self,value):if self.head: #判断头结点是否为空count=1p=self.headwhile p:if p.data==value:print(f'在第{count}个节点')breakelse:p=p.nextcount+=1if p==None:print('不存在')else:return Noneli=List()
li.create([x for x in range(10)])
li.select(5) #在第6个节点
li.select(55) #不存在

5.节点的删除

输入一个元素,把链表中这个元素节点的位置删除

#内容接上……#链表节点的删除def remove(self,value):if self.head:p=self.headwhile p:if p.next.data==value: #获取到要删除节点的上一个节点p.next=p.next.next #把下一个获取到的节点指向下下个节点print('删除成功')breakelse:p=p.nextif p==None:print('删除失败')else:return Noneli=List()
li.create([x for x in range(10)])
li.tarvel()
li.remove(5)
li.tarvel()
#输出结果:
# 0 1 2 3 4 5 6 7 8 9
# 删除成功
# 0 1 2 3 4 6 7 8 9

6.节点的插入

给定一个数据value,然后把这个数据插入到链表中第n节点后面

#内容接上……#插入数据节点到链表中def insert(self,value,n):q=Listnode(value) #创建一个节点if n == 0:#判断是否插入作为第一个节点q.next=self.headself.head=q #新节点作为头结点else:p=self.headcount=1while count

7.链表元素的修改

给定一个数据value,然后把链表第n个节点的数据改为value

#内容接上……#链表元素的修改def update(self,value,n):if self.head:p=self.headcount=1while count

 8.链表的反转

给定一个链表,然后让这个链表倒置输出

 如图所示:

 要想实现链表的转置,我们只需要把指针域指向的区域反过来就行了,如图所示:

代码实现:

#内容接上……#链表的转置def reverse(self):#初始化操作p=self.head.nextself.head.next=Nonewhile p:q=p.next #获取到当前进行操作节点的下一个节点p.next=self.head #然后把当前操作节点的指针域指向上一个节点self.head=p       #头节点往后面移动p=q               li=List()
li.create([x for x in range(10)])
li.tarvel()
li.reverse()
li.tarvel()
#输出结果:
# 0 1 2 3 4 5 6 7 8 9 
# 9 8 7 6 5 4 3 2 1 0 

9.全部代码

以上就是Python中链表增删改查以及转置的全部内容了,下面就是全部代码:

#建立节点对象
class Listnode(object):def __init__(self,data=0,next=None):self.data=dataself.next=next
#创建链表对象
class List(object):def __init__(self):#先定义头节点的实例化对象self.head=None# 创建链表def create(self,alldata):#alldata是表示一组数据self.head=Listnode(alldata[0]) #创建好头节点,把第一个数据给到头结点cur=self.head  #cur为移动指针for i in alldata[1:]:#根据数据的多少,依次创建后面的节点p=Listnode(i)cur.next=pcur=preturn self.head #返回一个这个实例化头节点#遍历链表def tarvel(self):if self.head: #先判断头结点是否为空p=self.headwhile p:print(p.data,end=' ')#依次输出数据p=p.nextprint('')else:return#链表元素的查询def select(self,value):if self.head:count=1p=self.headwhile p:if p.data==value:print(f'在第{count}个节点')breakelse:p=p.nextcount+=1if p==None:print('不存在')else:return None
#内容接上……#链表节点的删除def remove(self,value):if self.head:p=self.headwhile p:if p.next.data==value: #获取到要删除节点的上一个节点p.next=p.next.next #把下一个获取到的节点指向下下个节点print('删除成功')breakelse:p=p.nextif p==None:print('删除失败')else:return None
#内容接上……#插入数据节点到链表中def insert(self,value,n):q=Listnode(value) #创建一个节点if n == 0:#判断是否插入作为第一个节点q.next=self.headself.head=q #新节点作为头结点else:p=self.headcount=1while count

这些就是链表类型的相关方法,over

好了,这一期就到这里了,我们下一期再见!

分享一张壁纸:

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...