用于删除和 return Linked 列表中的最后一个 Link 的代码有什么问题?
Whats wrong with this code used to delete and return the last Link in a Linked List?
public Link getEnd(LinkList a, Link current){
if(current.next == null){
Link temp = current; //here I save the Link in a variable before nullifying it
current = null;
return temp;
}
else{
getEnd(a , current.next);
}
return null;
}
我正在为 LinkedList
使用 class,它是专门为我正在参加的 CS 课程编写的,所以如果语法与你的不一样,请记住这一点习惯了。
这里发生的是我得到一个空指针异常,列表中的最后一个 Link 是相同的,没有任何反应。
声明:
current = null;
更改局部变量的值,而不是列表结构。完全没有效果。
如前所述,current
是一个 local 变量。更改它没有任何作用。
您想修改倒数第二个元素,然后
secondlast.next = null;
取消链接最后一个元素。此外,Java 不允许您引用 current.next
字段 ,只能复制引用。在 C 中,这样的代码可以写得更短,但这需要成熟的指针操作。
所以你确实需要修改你的整体逻辑来向前看多一个元素。最简单的可能是将您的方法设计为
public Link getEnd(LinkedList a, Link previous, Link current) {
...
if (previous != null) previous.next = null;
...
else
...
return getEnd(a, current, current.next);
}
但是,我建议使用非递归实现。
public Link getEnd(LinkedList a) {
if (a.head == null) return null; // Empty list.
Link previous = null, current = a.head;
while(current.next != null) {
previous = current;
current = current.next;
}
// Figure out what to do now yourself. It's easy.
}
public Link getEnd(LinkList a, Link current){
if(current.next == null){
Link temp = current; //here I save the Link in a variable before nullifying it
current = null;
return temp;
}
else{
getEnd(a , current.next);
}
return null;
}
我正在为 LinkedList
使用 class,它是专门为我正在参加的 CS 课程编写的,所以如果语法与你的不一样,请记住这一点习惯了。
这里发生的是我得到一个空指针异常,列表中的最后一个 Link 是相同的,没有任何反应。
声明:
current = null;
更改局部变量的值,而不是列表结构。完全没有效果。
如前所述,current
是一个 local 变量。更改它没有任何作用。
您想修改倒数第二个元素,然后
secondlast.next = null;
取消链接最后一个元素。此外,Java 不允许您引用 current.next
字段 ,只能复制引用。在 C 中,这样的代码可以写得更短,但这需要成熟的指针操作。
所以你确实需要修改你的整体逻辑来向前看多一个元素。最简单的可能是将您的方法设计为
public Link getEnd(LinkedList a, Link previous, Link current) {
...
if (previous != null) previous.next = null;
...
else
...
return getEnd(a, current, current.next);
}
但是,我建议使用非递归实现。
public Link getEnd(LinkedList a) {
if (a.head == null) return null; // Empty list.
Link previous = null, current = a.head;
while(current.next != null) {
previous = current;
current = current.next;
}
// Figure out what to do now yourself. It's easy.
}