gpt4 book ai didi

java-双向链表逻辑

转载 作者:搜寻专家 更新时间:2023-11-01 02:06:56 26 4
gpt4 key购买 nike

我正在尝试了解双向链表的 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 and prev=head。一个问题是,如果列表中至少有一项可用,并且我将另一项添加到 HEAD 位置,“next”不应该指向前一个 head,而“prev”指向 null 吗?可能是错误的代码??

2)代码是什么

head.next.prev = head;

是什么意思??为什么有必要?我真的不明白这个逻辑...:(

任何帮助将不胜感激..

最佳答案

这个实现是错误的。如果多次调用 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;
}
}

在头部插入节点是一个两步操作:

  1. 创建节点,设置它的next指针指向当前头,并将其指定为链表的新头。
  2. 将旧磁头的previous指针设置为新磁头。这就是语句 head.next.prev = head 所做的。

关于java-双向链表逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30411696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com