我编写了从链接列表中删除某个位置节点的代码。
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。但是当我从函数返回并打印结果列表时,我仍然找到了最后一个Node。我不明白为什么最后一个节点不能设置为NULL。
假设一个链表,3 -> 4 -> 6 -> 7 -> 1你必须删除最后一个位置(第5位)的数字,
' root'的类型是' Node '而不是' LinkedList '。在您的代码中,当您到达最后一个位置时,变量' root '将保存数据' 1 '存储位置的地址,例如,
root = @addrlocation
当你赋值时,
root = null
'root'变量不指向任何内容,实际上您将不删除任何内容。这里的关键是你必须将最后一个节点的'next'节点设置为'null'
在上面的链表中,保存数据' 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;
}
root = null;
对链表没有任何影响。它只是在参数位置Node root
中存储null,而不是在Node实例变量中存储null。
要删除node对象链表中的一个节点,只能使用诸如root之类的语句。Next = null将从列表中删除一个节点。
详细讨论链表的处理对我来说有点太费力了。找一本关于数据结构的好书,或者阅读Java的链表实现。
我认为你的问题是你对引用传递的语义感到困惑。让我们看一下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
不受影响。