当前位置: 首页 > 知识库问答 >
问题:

双链表逻辑

谷玉韵
2023-03-14

我试图理解双重链表的java实现。我有以下代码:

public class DLLNode{
    //define variables
    public int info;
    public DLLNode next;
    public DLLNode prev;


    //Passing constructors
    public DLLNode(int i){
        info = i;
        next = prev = null;
    }

    public DLLNode(int i, DLLNode n, DLLNode p){
        info = i;
        next = n;
        prev = p;
    }
}

和以下内容:

public class DLL {
    DLLNode head;
    DLLNode tail;

    public DLL(){
        head = tail = null;
    }

    //Check whether list is empty or not
    public boolean isEmpty(){
        return head == null;
    }

//Insert element to head
    public void insertHead(int n){
        if(isEmpty()){
            head = tail = new DLLNode(n);
        }
        else{
            head = new DLLNode(n, null, head);
            head.next.prev = head;
        }
    }

为了清晰起见,这里只显示了insertHead()方法。

现在我明白了,如果有人在main方法中运行insertHead(10),如果列表为空;一个新的对象形成,头部和尾部引用变量都指向该对象。

我不明白的是如果列表不是空的;代码段非常混乱。

head = new DLLNode(n, null, head);
head.next.prev = head; //really confusing, what does this mean??

1)我所理解的是n=10,null和head被传递给构造函数:public DLLNode(int I,DLLNode n,DLLNode p)。然后赋值info=10,next=null和prev=head。一个问题是,如果列表中至少有一个项目可用,并且我在head位置添加了另一个项目,那么“next”不应该指向前面的head,而“prev”不应该指向null??可能是错误代码??

2)代码是什么

head.next.prev = head;

刻薄??为什么有必要??我真的不明白那个逻辑...:(

如果有任何帮助,我们将不胜感激。

共有1个答案

容学林
2023-03-14

这种实现是错误的。如果不止一次调用,inserthead将抛出NullPointerException:

 head = new DLLNode(n, null, head);
 head.next.prev = head;  // head.next is null because of the above call

相反,插入的实现应该是:

public void insertHead(int n) {
    if (isEmpty()) {
        head = tail = new DLLNode(n);
    } else {
        head = new DLLNode(n, head, null);
        head.next.prev = head;
    }
}

在head插入节点需要两个步骤:

  1. 创建节点,将其下一个指针设置为指向当前头,并将其指定为列表的新头。
  2. 将旧磁头的前一个指针设置为新磁头。这就是语句head.next.prev=head所做的。
 类似资料:
  • 我写了一个程序,通过双链表管理银行账户,但我发现取消程序有问题。 我仍然有同样的问题,即使我尝试了这个方法:-(pnt)-

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 主要内容:双向链表的创建目前我们所学到的 链表,无论是动态链表还是 静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为 单向链表(或 单链表)。 虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后"

  • 链表作为数组之外的一种常用序列抽象, 是大多数高级语言的基本数据类型, 因为 C 语言本身不支持链表类型, 大部分 C 程序都会自己实现一种链表类型, Redis 也不例外 —— 实现了一个双端链表结构。 双端链表作为一种常见的数据结构, 在大部分的数据结构或者算法书里都有讲解, 因此, 这一章关注的是 Redis 双端链表的具体实现, 以及该实现的 API , 而对于双端链表本身, 以及双端链表

  • 双向链表 结构体 struct   rt_list_node   双向链表节点 更多...   宏定义 #define  rt_container_of(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))   获取type结构体中member成员在这个结构体中的偏移   #de

  • 双向链表 Linux 内核自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会从双向链表数据结构开始内核的数据结构。为什么?因为它在内核里使用的很广泛,你只需要在 free-electrons.com 检索一下就知道了。 首先让我们看一下在 include/linux/types.h 里的主结构体: struct list_head { struct l