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 index0:
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