python之双链表

双链表简单讲解

双向链表(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)

结果展示

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值