双链表简单讲解
双向链表(doubly linked list)是一种链式数据结构,它的每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。与单向链表相比,双向链表可以在任何位置进行插入和删除操作,因为每个节点都可以通过前向或后向指针访问其前驱和后继。
图例说明
这里讲解一个双链表节点添加的例子,我们看到10,15,20这三个点的位置,其中原本是10和20相互连接,首先,我们要先将15的next指向20,因为,如果我们现将10的next指向15的话,那20的地址就会消失,这要就会导致我们的数据丢失,所以要先连接15和20,然后就是把20的prior(前驱)指向15,最后再是15的prior(前驱)指向10,10的next指向15,这样我们就完成插入的程序了。
代码实现
class Node(object):
"""
创建一个双链表
"""
def __init__(self, item):
self.item = item
self.next = None
self.prior = None
class FunctionLink(object):
def __init__(self):
self.linklength = 1
self.head = None # 首先初始化,让头结点指向空
def creatLinkListHead(self, li):
"""
头插法
:return:
"""
head = Node(li[0])
for element in li[1:]:
self.linklength += 1
node = Node(element) # 创建一个节点
node.next = head
head.prior = node
head = node
return head
def creatLinkListTail(self, li):
"""
此方法为尾插法
:param li:
:return:
"""
head = Node(li[0])
for element in li[1:]:
self.linklength += 1
node = Node(element)
head.next = node
node.prior = head
return head
def printLinkList(self, lk):
"""
此方法为打印链表中的数字
:param lk:传入头结点的地址
:return:
"""
while lk:
if not lk.next:
print(lk.item)
lk = lk.next
else:
print(lk.item, end=",")
lk = lk.next
def inserLinkList(self, index, element, curNode):
"""
此方法为插入数据
:param index:输入要传入数据的位置索引值
:param element: 输入要传入的数据
:param curNode: 输入你的头链表位置
:return:
"""
head = curNode # 现将链表的头链表进行存储
number = 1
if index > self.linklength:
raise Exception("对不起您输入的索引值超过了链表的长度")
else:
while True:
if index == number:
p = Node(element) # 创建节点
p.next = curNode.next
curNode.next.prior = p
p.prior = curNode
curNode.next = p
self.linklength += 1
curNode = head
break
else:
curNode = curNode.next
number += 1
def deleteLinkList(self, index, curNode):
"""
删除输入的索引值后面的结点
:param index: 要删除的索引位置
:param curNode: 头结点地址
:return:
"""
head = curNode # 先将头指针的地址赋值给一个临时节点
number = 1
if index > self.linklength:
raise Exception("对不起,您输入的索引位置超过了链表的长度,请重新输入")
else:
while True:
if number == index:
p = curNode.next
curNode.next = p.next
p.next.prior = curNode
self.linklength -= 1
curNode = head
break
else:
curNode = curNode.next
number += 1
if __name__ == '__main__':
func = FunctionLink()
doublelk = func.creatLinkListHead([1, 2, 3, 4])
func.printLinkList(doublelk)
func.inserLinkList(2, 10, doublelk)
func.printLinkList(doublelk)
func.deleteLinkList(2, doublelk)
func.printLinkList(doublelk)