python3实现链表的基础操作


python3实现链表的基础操作


实现的步骤:

一、建立链表模型

二、遍 历 链 表

三、获取链表长度

四、追 加 节 点

五、插 入 操 作

六、主 调 函 数

分析:

(1)建立链表模型:

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

在这里插入图片描述

那么要想实现这个模型我们可以用以下的代码来实现:
lass sigLink():
    """
    self.length   用于记录链表的长度
    self.head     链表的头部
    self.tail     记录链表的尾部
    """
    def __init__(self,item):
        """
        item   一位数组,存放改链表的数组
    """
    self.length=len(item)
    if self.length<=0:
        return
    i=0
    self.head=linkNode(item[i])
    self.tail=self.head
    i+=1###此句不能少
    while i<self.length:
        self.tail.next=linkNode(item[i])
        self.tail=self.tail.next
        i+=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.head
        while 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.next
        self.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参数超出范围”)
return
if indexself.length:
self.linkAppend(num)
return
if index
0:
p=linkNode(num)
p.next=self.head
self.head=p
self.length+=1
return
ptemp=self.head
while index>1:
ptemp=ptemp.next
index-=1
p=linkNode(num)
p.next=ptemp.next
ptemp.next=p
self.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+=1
if 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=dat
        self.next=None
class sigLink():
    """
    self.length   用于记录链表的长度
    self.head     链表的头部
    self.tail     记录链表的尾部
    """
    def __init__(self,item):
        """
        item   一位数组,存放改链表的数组
    """
    self.length=len(item)
    if self.length&lt;=0:
        return
    i=0
    self.head=linkNode(item[i])
    self.tail=self.head
    i+=1###此句不能少
    while i&lt;self.length:
        self.tail.next=linkNode(item[i])
        self.tail=self.tail.next
        i+=1
def printlink(self):
    """
        正序打印该链表
    """
    if self.head==None:
        print("该链表为空链表!")
    p=self.head
    while p!=None:
        print(p.dat,end=" ")
        p=p.next
def getlength(self):
    """
        获取链表的长度
    """
    print("该链表的长度为:",self.length)
def linkAppend(self,num):
    """在链表尾部追加节点"""
    self.tail.next=linkNode(num)
    self.tail=self.tail.next
    self.length+=1
def insertNode(self,index,num):
    """
        在链表中间插入节点
        index:插入节点的序号
        num:插入点的值
    """
    if index&gt;self.length:
        print("index参数超出范围")
        return
    if index==self.length:
        self.linkAppend(num)
        return
    if index==0:
        p=linkNode(num)
        p.next=self.head
        self.head=p
        self.length+=1
        return
    ptemp=self.head
    while index&gt;1:
        ptemp=ptemp.next
        index-=1
    p=linkNode(num)
    p.next=ptemp.next
    ptemp.next=p
    self.length+=1

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&lt;number:
    operation=input("请输入你要进行的操作名称:")
    name=flag+str(operation)
    i+=1
    if 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&gt;=number:
    print("\n")
    print("执行次数已经达到,结束程序!")
    i=i-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值