链表
链表是用指针连接的用于存储数据的数组,它最大的优点在于可以有效利用零碎的内存空间。
如果使用了链表,则可以改变数组的长度,并且可以在同一个数组中存储不同类型的元素。
一、 单链表
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,删除就完成了。