java双链表逻辑

java双链表逻辑,java,object,doubly-linked-list,Java,Object,Doubly Linked List,我试图理解一个双链表的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; }

我试图理解一个双链表的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(inti,DLLNode n,DLLNode p)。然后赋值信息=10,next=null,prev=head。一个问题是,如果列表中至少有一个项目可用,并且我将另一个项目添加到HEAD位置,那么“next”不应该指向前一个HEAD,而“prev”不应该指向null??可能是错误代码

2) 代码是什么

head.next.prev = head;
平均值??为什么有必要呢??我真的不明白这个逻辑…:(


任何帮助都将不胜感激。

此实现是错误的。
插入头
如果多次调用,将抛出
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;
    }
}
在头部插入节点分为两步操作:

  • 创建节点,将其next指针设置为指向当前头部,并将其指定为列表的新头部
  • 将旧磁头的previous指针设置为新磁头。这就是语句
    head.next.prev=head
    的作用

  • 是的,你是对的,但是代码完全按照你说的做(只有一个错误),如果我们使用括号,可能会更清楚:

    (head.next).prev = head;
    
    我们将刚刚创建的节点分配给下一个节点。或者换句话说:我们将旧头的prev引用更新为新头,这是必要的,因为

    head = new DLLNode(n, null, head);
    
    创建一个新磁头,其中previous指向
    null
    ,next是旧磁头,但旧磁头previous的引用仍然是
    null

    构造函数中的元素顺序错误(或在创建新头的调用中)


    它是有效的。

    看来你是对的,它应该是新的DLLNode(n,head,null)相反。你试过运行它吗?它确实可以编译,但逻辑与使用的方法名称混淆。这让我担心,我担心我遗漏了一些琐碎的东西。编译,是的。运行-不针对多个元素。这种东西是一个很好的实验场所。在调试器中使用它,你会更容易理解确定它是否是好代码。我会的。谢谢你的快速回复reply@maraca-因为您在第二个参数中传递了
    null
    ,在第三个参数中传递了head。第二个参数传递到
    next
    -因此
    next
    变为
    null
    ,第三个参数传递到
    prev
    ,而ch将成为旧头。由于
    next
    为空,
    head.next.prev
    将抛出一个NPE。
    public DLLNode(int i, DLLNode p, DLLNode n) {