我试图理解一个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()方法。
现在我明白了,如果有人在主方法中运行insertHead(10),如果列表为空,则会形成一个新对象,并且head和tail引用变量都指向该对象。
但是,如果列表不为空,这段代码非常令人困惑,我不明白其中的含义。
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;
mean是什么?为什么需要它?我真的不理解这个逻辑...:(
任何帮助都将不胜感激。
new DLLNode(n, head, null)
而不是其他。你试过运行它了吗? - RealSkepticnull
,并且在第三个参数中传递了头部。第二个参数进入了next
- 所以next
变成了null
,第三个参数进入了prev
,它将成为旧的头部。由于next
是 null,head.next.prev
将抛出 NPE。 - RealSkeptic