澄清:主要问题是哪个节点类似于current.previous.next = current.next实际指向?
我正在使用我在YouTube视频中找到的一些示例代码,但我真的试图将其分解并理解它。一切都按原样运作,我在每个部分都添加了评论以帮助我理解。我真正遇到的问题是,当代码在同一行开始使用上一个和下一个时,解释正常英语发生的情况是节点删除。我并没有完全遵循它现在指向的内容。我已经完成了调试器中的代码,但如果有人不介意,我需要一些简单的英语解释。
比方说,我有一个有3,4,5,6,7的DLL。所以我要删除5,这是第3个索引。这是删除方法。
//Method to remove node at a specified position
public void removeAt(int index) {
//If the head doesn't exist, break out of the logic
if(head == null) return;
//If the requested index is smaller than 1 or greater
//than the size of the list, break out.
if(index < 1 || index > size) return;
//Declares the currently used link as the head
Link current = head;
//Declare int i counter for use in while loop
//While i is less than the index set current to the next node
//and add to the counter i
int i = 1;
while(i < index) {
current = current.next;
i++;
}
//If the next node doesn't exist, set current...previous next?
if(current.next == null) {
current.previous.next = null;
}
//Else if the node before the current is null, set current to
//the next node and then set the previous to null (I thought it
//already was null??) Set the head to the current node
else if(current.previous == null) {
current = current.next;
current.previous = null;
head = current;
}
//If none of the above conditions, set current previous next?? to
//the next node and current next previous to the previous node??
else {
current.previous.next = current.next;
current.next.previous = current.previous;
}
//Subtract from the size of the list
size--;
}
当我开始使用current.previous.next和current.next.previous时,我的主要理解问题就出现了。对我来说,current.previous.next只是说要保持最新状态。如果我有三个数字,3 4 5和当前是4,那么之前是3,所以接下来只会回到4.我知道这不对,但在阅读其他帖子后,Javadoc和观看视频,我仍然不明白发生了什么。
这是另一个类:
public class Link {
private int data;
public Link previous;
public Link next;
public Link(int data) {
previous = null;
this.data = data;
next = null;
}
public Link(Link previous, int data, Link next) {
this.previous = previous;
this.data = data;
this.next = next;
}
public int Data() {
return data;
}
}
我很感激一些解释。谢谢!
答案 0 :(得分:0)
如果node.next为null,则表示该节点是列表的最后一个元素。因此,如果您尝试删除列表的最后一个元素,则最后一个元素之前的元素将成为最后一个元素。这是代码的作用
if(current.next == null) {
current.previous.next = null;
}
如果node.previous为null,则表示它是列表的第一个元素。首先,我们必须保持对以下元素的引用,定义以下元素不能具有前一个元素,然后将其定义为列表的头部。这是代码的作用
if(current.previous == null) {
current = current.next;
current.previous = null;
head = current;
}
然后继续你的榜样 如果current为4,则current.previous为3,current.next为5 所以
current.previous.next = current.next
定义3.next现在为5
和
current.next.previous = current.previous
定义5.previous现在是3
因此,列表中的4不再是引用
答案 1 :(得分:0)
Doubly link list(DLL)是一个可以在您已知的两个方向上遍历的列表。每个节点都有前一个和下一个指向其兄弟节点的指针,允许导航到两个方向。您已经有head
变量指向链表的头部。
您在要删除的节点的索引中传递的remove
方法。
while(i < index) {
current = current.next;
i++;
}
while while循环将current
节点设置为我们要删除的节点。此时有三种情况需要处理。
current.previous
指向任何内容,current.next
可能指向下一个节点(如果有)。current.next
= null。当前节点既不是列表的头部也不是尾部,因此current.next
和current.previous
具有相应的值。
if(current.next == null) {
current.previous.next = null;
}
上面的代码部分将是上面提到的第二点。 current
指向最后一个节点。要删除最后一个节点,您必须返回current.previous
并将其链接设置为null
,以便current
节点无法再访问previous
。
else if(current.previous == null) {
current = current.next;
current.previous = null;
head = current;
}
检查当前节点是否是节点的头部。如果current
指向链接列表的头部,则它没有任何先前的兄弟,因此current.previous
指向null
。所以current.next
必须成为列表的新头。使用current.previous = null
我们将previous
链接设置为null,并将此current
头设置为head
变量。现在上一个节点已经消失。没有引用它。
第三种情况是上述要点3.由
处理else {
current.previous.next = current.next;
current.next.previous = current.previous;
}
我们要删除current
节点的位置。这意味着我们需要将current.previous
和current.next
链接为兄弟姐妹。
最后一点,您的Link
课程使用公共字段。它们应该是私有的,并通过getter和setter访问。