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