python算法之链表(单链表、双链表、插入元素、删除元素)

链表

链表是用指针连接的用于存储数据的数组,它最大的优点在于可以有效利用零碎的内存空间。
如果使用了链表,则可以改变数组的长度,并且可以在同一个数组中存储不同类型的元素。

一、 单链表

1.输出一个由两个列表组成的单链表:

源代码:

#输出一个由两个列表组成的单链表
ListValue = [1,5,6,2,4,3]
ListPointer = [3,2,-1,5,1,4]
head = 0    #head是指向链表第一个元素的指针,需要自己定义
print(ListValue[head])#直接输出第一个元素的值
next = ListPointer[head]#给next赋初始值
while next != -1:  #next是指向下一个元素的指针,不等于-1代表后面还有元素
    print(ListValue[next])   #输出下一个元素中存储的值
    next = ListPointer[next]   #把指针变为下一个元素中存储的指针

运行:
在这里插入图片描述

2.输出一个列表套列表组成的单链表

源代码:

#输出一个列表套列表组成的单链表
value = 0   #预先设置好值和指针在小数组中的位置
pointer = 1
LinkedList = [[1,3],[5,2],[6,-1],[2,5],[4,1],[3,4]]
head = 0
print(LinkedList[head][value])   #直接输出第一个元素的值
next = LinkedList[head][pointer]   #给next赋初始值

while next != -1:  #next是指向下一个元素的指针,它不等于-1代表后面还有元素
    print(LinkedList[next][value])   #输出下一个元素中存储的值
    next = LinkedList[next][pointer]   #把指针变为下一个元素中存储的指针

运行:
在这里插入图片描述

3.向单链表中插入元素

源代码:

#向单链表中插入元素
def output(listValue,listRight,head):  #定义一个函数用于输出链表
    print(listValue[head])
    next = listRight[head]
    while next != -1:
        print(listValue[next])
        next = listRight[next]
        
listValue = [1,5,6,2,7,3]
listRight = [3,2,4,5,-1,1]
head = 0
prepos = 5   #已知要插入的位置的上一个元素的位置

output(listValue,listRight,head)#输出为插入元素的链表
print()

listValue.append(4)#向数组末加上新元素的值4
listRight.append(listRight[prepos])#加上新元素指针指向的位置(下一个元素)
listRight[prepos] = len(listValue) - 1#上一个元素的指针只相信元素

output(listValue,listRight,head)#输出已经插入元素的链表

运行:
在这里插入图片描述

3.删除单链表中的元素

源代码:

#删除单链表中的元素
def output(listValue,listRight,head):#输出函数
    print(listValue[head])
    next = listRight[head]
    while next != -1:
        print(listValue[next])
        next = listRight[next]
        
listValue = [1,5,6,2,7,3]#建立单链表
listRight = [3,2,4,5,-1,1]

head = 0#确定头指针
prepos = 5#确定要删除的元素的前一个数的位置
output(listValue,listRight,head)#输出删除前的链表
print()

listRight[prepos] = listRight[listRight[prepos]]#删除元素

output(listValue,listRight,head)#输出删除后的链表

运行:
在这里插入图片描述

二 、双链表

1.正序输出双链表

源代码:

#正序输出双链表
listValue = [1,5,6,2,7,3]   #第一种模拟双链表的方法
listRight = [3,2,4,5,-1,1]   #分别使用三个数组来存储数值
listLeft = [-1,5,1,0,2,3]  #指向上一个元素和下一个元素的指针

head = listLeft.index(-1)#头指针的值为-1在ListLeft中的位置
print(listValue[head])
next = listRight[head]

while next > -1:
    print(listValue[next])
    next = listRight[next]
print()     #换行隔开两个链表的输出结果
right = 1   #第二种模拟双链表的方法
left = 2  
value = 0
linkedList = [[1,3,-1],[5,2,5],[6,4,1],[2,5,0],[7,-1,2],[3,1,3]]
head = 0     #提前设置头指针指向的位置
print(linkedList[head][value])
next = linkedList[head][right]
while next > -1:
    print(linkedList[next][value])
    next = linkedList[next][right]

运行:
在这里插入图片描述

2.双向输出双链表

源代码:

#双向输出双链表
listValue = [1,5,6,2,7,3]   #第一种模拟双链表的方法
listRight = [3,2,4,5,-1,1]   #分别使用三个数组来存储数值
listLeft = [-1,5,1,0,2,3]  #指向上一个元素和下一个元素的指针

head = listLeft.index(-1)
print(listValue[head])
next = listRight[head]
while next > -1:
    print(listValue[next])
    next = listRight[next]

head = listRight.index(-1)      #从这里开始的是反向输出
print(listValue[head])
next = listLeft[head]
while next > -1:
    print(listValue[next])
    next = listLeft[next]

运行:
在这里插入图片描述

3.向双链表中插入元素

源代码:

#向双链表中插入元素
def output(listValue,listRight,head):#定义一个函数用于输出链表
    print(listValue[head])
    next = listRight[head]
    while next != -1:
        print(listValue[next])
        next = listRight[next]
        
listValue = [1,5,6,2,7,3]#建立一个双链表
listRight = [3,2,4,5,-1,1]
listLeft = [-1,5,1,0,2,3]
head = 0#确定第一个元素的位置
prepos = 5#确定要插入的位置的前一个元素的位置

output(listValue,listRight,head)#输出未经插入的链表
print()

listValue.append(4)#在List Value数组末尾加上新元素的值
listRight.append(listRight[prepos])#给新元素的亮哥哥指针赋值
listLeft.append(prepos)
listLeft[listRight[prepos]] = len(listValue) - 1#将前后元素的指针指向新元素
listRight[prepos] = len(listValue) - 1

output(listValue,listRight,head)#输出插入后的链表

运行:
在这里插入图片描述

4.删除双链表中的元素

首先建立双链表,确定头指针和要删除的元素的前一个元素,然后在对链表进行操作。

listValue = [1,5,6,2,7,3]#建立双链表
listRight = [3,2,4,5,-1,1]
listLeft = [-1,5,1,0,2,3]
head = 0#确定头指针
prepos = 5#确定前一个元素的位置

现在我们对链表进行删除元素的操作:


ListRight[prepos]=ListRight[ListRight[prepos]]#把钱一个元素的right指针指向后一个元素
ListLeft[ListRight[ListRight[prepos]]]=prepos#把后一个元素的left指针指向前一个元素

ListRight[prepos]存储的是要删除的元素的位置,则ListRight[ListRight[prepos]]存储的是要删除的元素的下一个元素的位置,所以ListLeft[ListRight[ListRight[prepos]]]就是这个元素的left指针,把当前元素的位置赋给它,也就是prepos,删除就完成了。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎明之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值