【问题标题】:Not able to set last location of linklist as NULL无法将链接列表的最后位置设置为 NULL
【发布时间】:2016-10-16 18:41:07
【问题描述】:
我写了从链表中删除某个位置的节点的代码。
static Node deletesNodebyposition(Node root,int position)
{
if(root == null)
return null;
Node head = root;
int x=1;
while(x < position && root !=null){
root = root.next;
x++;
}
if(root.next !=null) {
root.data = root.next.data;
root.next = root.next.next;
}
else
root = null;
return head;
}
在我选择要删除的最后一个节点之前,代码运行良好。当我输入删除节点的最后一个位置时,我试图将节点设置为 NULL。但是当我从函数返回并打印我的结果列表时,我仍然找到了最后一个节点。我无法理解为什么最后一个节点无法设置为 NULL。
【问题讨论】:
标签:
java
data-structures
linked-list
【解决方案1】:
假设一个链表,
3->4->6->7->1
你必须删除最后一个位置(第5个位置)的数字,
‘root’的类型是‘Node’而不是 LinkedList。在您的代码中,当您到达最后一个位置时,变量“root”将保存存储数据“1”的位置的地址,例如,
root = @addrlocation
当你分配时,
root = null
'root' 变量不指向任何内容,实际上您不会删除任何内容。这里的关键是您必须将最后一个节点的“下一个”节点设置为“空”
在上面的链表中,最后一个节点保存数据'7',仍将保存'next'节点的地址为@addrlocation。因此,对于您提到的特定情况,您的更改不会对链接列表产生任何影响。
您可以参考上一个节点“previous”来解决问题。我已经修改了你的代码并粘贴在下面,
static Node deletesNodebyposition(Node root,int position)
{
if(root == null)
return null;
Node head = root;
Node previous = null;
int x=1;
while(x < position && root !=null){
previous = root;
root = root.next;
x++;
}
previous.next = root.next;
return head;
}
【解决方案2】:
声明
root = null;
对链表没有任何影响。它只是将 null 存储在参数位置 Node root 中,而不是在 Node 实例变量中。
要删除 Node 对象的链表中的一个节点,只有 root.next = null 之类的语句会从链表中删除一个节点。
足够详细地讨论链表的处理对我来说有点太费力了。获取一本关于数据结构的好书,或者阅读 Java 的链表实现。
【解决方案3】:
我认为您的问题是您对按引用传递的语义感到困惑。让我们看一下Node 的声明。
Node foo = new Node();
此语句分配一个新的Node 对象,并将该对象的内存地址分配给变量foo。请注意,变量本身不包含对象,而是对它的引用。
当你将一个对象传递给一个方法时,你并没有传递对象本身。相反,会为该方法创建一个 new 引用变量,并将内存地址(在本例中,保存在 foo 中)复制到该变量中。
所以要把这个和你的方法联系起来
static Node deletesNodebyposition(Node root, int position)
{
当这个方法被调用时root被创建,这是一个全新的引用变量。 foo 的值被复制到 root。由于它们都指向同一个内存块,因此您可以执行以下操作
root.data = root.next.data;
root.next = root.next.next;
因为您正在使用引用转到先前分配的内存块。但是,声明
root = null;
不是将foo 设置为null,而是将root 设置为null。因此foo 不受影响。