这是我在节点具有给定节点值之前删除节点的方法,但是它不起作用,我该怎么办。例如,1到5,放入RemoveBefore(3),它将删除4。
public void RemoveBefore(int nodeValue)
{
Node curr = start;
while (curr != null)
{
Node next = curr.next;
if (next!= null && next.nodeValue == nodeValue)
{
curr= next.next;
return;
}
curr = curr.next;
}
}
答案 0 :(得分:0)
像你一样修改curr
的值:
curr= next.next;
不会对列表本身进行任何更改,因为curr
只是一个本地引用,更改引用不会更改它所指向的内容。
如果希望更改生效,则需要修改引用所指向的对象的内容。
在您的情况下,情况如下:
... -> prev -> curr -> next -> next.next -> ...
如果next
具有您的价值,您希望prev
直接指向next
,实际上从列表中删除curr
,如下所示:
... -> prev -> next -> next.next -> ...
这意味着您要更改prev
,使其指向next
而不是curr
。
因此,在您的代码中,您需要引入prev
变量,并在要删除的节点本身就是开始时管理特殊情况:
startNode -> node2 -> node3 -> ...
必须成为:
node2 (the new start node) -> node3 -> ...
这就是我修改代码的方法:
public void RemoveBefore(int nodeValue)
{
Node curr = start;
Node previous = null;
while (curr != null)
{
Node next = curr.next;
if (next!= null && next.nodeValue == nodeValue)
{
if( previous == null) {
start = next; // change directly the start of the list
} else {
previous.next = next; // point to next instead of curr
}
return;
}
previous = curr;
curr = curr.next;
}
}