zoukankan      html  css  js  c++  java
  • 双链表结构

    双链表结构比单链表结构更有优越性。它允许用户做如下的事情:

    • 从给定的节点,向左移动到前一个节点。
    • 直接移动到最后一个节点。

    双链表结构的节点类的python实现,通过给provious指针添加一个字段,扩展了前面所讨论的Node类。如下是两个类的代码:

    # coding: utf-8
    class Node(object):
        def __init__(self, data, next=None):
            self.data = data
            self.next = next
            
    
    class TowWayNode(Node):
        def __init__(self, data, previous=None, next=None):
            Node.__init__(self, data, next)
            self.previous = previous

    如下是测试程序,它通过在末尾添加项来创建了一个双链表结构。然后,程序从最后一个项开始朝着第一项处理,最终显示了整个链表结构的内容:

    # coding: utf-8
    class Node(object):
        def __init__(self, data, next=None):
            self.data = data
            self.next = next
    
    
    class TowWayNode(Node):
        def __init__(self, data, previous=None, next=None):
            Node.__init__(self, data, next)
            self.previous = previous
    
    
    head = TowWayNode(1)
    tail = head
    for data in range(2,6):
        tail.next = TowWayNode(data, tail)
        tail = tail.next
    
    probe = tail
    while probe != None:
        print probe.data
        probe = probe.previous

    考虑一下程序的第一个循环中的如下两条语句:

    tail.next = TowWayNode(data, tail)
    tail = tail.next

    这些语句的目的是在链表结构的末尾插入一个新的项。可以假设在链表结构中至少有一个节点,并且tail尾指针总是指向这个非空链表结构的最后一个节点。必须按照如下的顺序来设置3个指针:

    1. 新节点的previous指针必须指向当前的尾节点。通过将tail当作该节点的构造方法的第2个参数,来实现这一点。
    2. 当前尾节点的next指针必须指向新的节点。第一条赋值语句做到这一点。
    3. tail指针必须指向新的节点。第二条赋值语句做到这一点。

    下图展示了在一个双链表结构的末尾插入一个新节点的过程。

     

    正如你所看到的,在双链表的中间插入,需要对较多的指针重定向。然而,不管目标位置在何处,需要重定向的指针数目总是常数级的。

    对于双链表结构的较为通用的插入和删除也有两种情况,这和针对单链表结构的操作是相同的。可以通过借助一个带有哑头节点的循环链表结构来简化这一操作。

    除了在结构的尾部插入和删除,双链表结构上的操作运行时间复杂度和单链表对应的操作是相同的。然而,双链表在的额外的指针,需要一个额外的、线性的内存使用量。

    结束!

  • 相关阅读:
    洛谷P4587 [FJOI2016]神秘数(主席树)
    洛谷P4609 [FJOI2016]建筑师(第一类斯特林数+组合数)
    Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)
    Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)
    Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
    Bzoj3197/洛谷3296 [SDOI2013]刺客信条assassin(树的重心+树Hash+树形DP+KM)
    关于二分图的完美匹配问题
    Bzoj3837 [Pa2013]Filary(随机化)
    Bzoj3566/洛谷P4284 [SHOI2014]概率充电器(概率dp)
    杜教筛学习笔记
  • 原文地址:https://www.cnblogs.com/aaronthon/p/13631035.html
Copyright © 2011-2022 走看看