双链表简单讲解
双向链表(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 = itemself.next = Noneself.prior = Noneclass FunctionLink(object):def __init__(self):self.linklength = 1self.head = None # 首先初始化,让头结点指向空def creatLinkListHead(self, li):"""头插法:return:"""head = Node(li[0])for element in li[1:]:self.linklength += 1node = Node(element) # 创建一个节点node.next = headhead.prior = nodehead = nodereturn headdef creatLinkListTail(self, li):"""此方法为尾插法:param li::return:"""head = Node(li[0])for element in li[1:]:self.linklength += 1node = Node(element)head.next = nodenode.prior = headreturn headdef printLinkList(self, lk):"""此方法为打印链表中的数字:param lk:传入头结点的地址:return:"""while lk:if not lk.next:print(lk.item)lk = lk.nextelse:print(lk.item, end=",")lk = lk.nextdef inserLinkList(self, index, element, curNode):"""此方法为插入数据:param index:输入要传入数据的位置索引值:param element: 输入要传入的数据:param curNode: 输入你的头链表位置:return:"""head = curNode # 现将链表的头链表进行存储number = 1if index > self.linklength:raise Exception("对不起您输入的索引值超过了链表的长度")else:while True:if index == number:p = Node(element) # 创建节点p.next = curNode.nextcurNode.next.prior = pp.prior = curNodecurNode.next = pself.linklength += 1curNode = headbreakelse:curNode = curNode.nextnumber += 1def deleteLinkList(self, index, curNode):"""删除输入的索引值后面的结点:param index: 要删除的索引位置:param curNode: 头结点地址:return:"""head = curNode # 先将头指针的地址赋值给一个临时节点number = 1if index > self.linklength:raise Exception("对不起,您输入的索引位置超过了链表的长度,请重新输入")else:while True:if number == index:p = curNode.nextcurNode.next = p.nextp.next.prior = curNodeself.linklength -= 1curNode = headbreakelse:curNode = curNode.nextnumber += 1if __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)