【问题标题】:Whats wrong with this code used to delete and return the last Link in a Linked List?这段用于删除和返回链接列表中最后一个链接的代码有什么问题?
【发布时间】:2015-01-04 15:28:25
【问题描述】:
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 使用一个专门为我正在学习的 CS 课程编写的课程,所以如果语法与您习惯的不同,请记住这一点。
这里发生的是我得到一个空指针异常并且列表中的最后一个链接是相同的,它没有任何反应。

【问题讨论】:

  • 不要在标题中添加标签。你已经在你的问题下使用了它们。
  • 如果你得到一个 NPE 那么这意味着你正在访问一个为空的变量上的方法或字段。在您的代码 sn-p 中,这只发生在一个引用上:“current.next”。我认为您需要将第一个 if 语句更改为“if(current == null)”
  • 两个cmets:看起来你想返回递归调用返回的值,如果你从不使用它为什么需要a参数(递归调用除外......哪个也不用)?
  • @bcsb1001 我稍后会在其他方法中使用 a。不过,这不是导致问题的原因。
  • 您没有保存返回的值...

标签: java list recursion linked-list


【解决方案1】:

如前所述,current 是一个 本地 变量。更改它没有任何作用。

你想修改倒数第二个元素,然后做一个

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.
}

【讨论】:

  • 是的,有效。我只是将 if 语句更改为 current.next.next == null 并将其中的两个电流更改为 current.next。我不必使用以前的。但是,我确实必须递归地解决这个问题,因为这就是问题所在。谢谢。
  • 小心。当您的列表很短时,current.next.next hack 将产生空指针异常。编写您的代码,使其也适用于 0 和 1 元素列表!我发布的最后一个版本是恕我直言,非常干净和强大(注意null 保护到位)。另外,如果回答有帮助,请采纳...
  • 是的,完美。谢谢! :)
【解决方案2】:

声明:

current = null;

更改局部变量的值,而不是列表结构。一点效果都没有。

【讨论】:

    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多