python3实现链表的基础操作

Posted William_Tao(攻城狮)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 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>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<=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
    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>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>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<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
    
    
    


以上是关于python3实现链表的基础操作的主要内容,如果未能解决你的问题,请参考以下文章

线性表--链表基础

数据结构 - 基于链表的队列

数据结构:链表

15.单向链表的一些基本操作实现

单链接表的实现之从尾部插入节点

数据结构基础学习——栈的概念及代码实现