0

我正在尝试从linkedList 中删除最后一个节点并将其返回。这是 Linkedlist 类的一部分。我编写的以下方法不会删除最后一个节点。有人知道为什么吗?

public int delete(){

    if(front==null){

        throw new NoSuchElementException(); 

    }else{

       ListNode current = front;

       while(current.next!=null){
          current = current.next;   
       }

       int delete = current.data;
       current = null;
       return delete;
    } 
}
4

6 回答 6

3

设置current为 null 只会更改对 null 的引用。它绝不会影响链表数据结构。您需要找到倒数第二个节点并将其下一个指针设置为空:

int data = secondToLastNode.next.data;
secondToLastNode.next = null;
return data;

当然,您需要处理列表中只有一个节点以上代码未考虑的情况。

于 2013-03-05T23:26:56.133 回答
2

您需要涵盖三种情况:

  1. 您的列表中没有条目。通常在这种情况下你只是退出,但像你一样抛出异常应该没问题。
  2. 您的列表中只有一个条目。在这种情况下,您的变量front将有一个值,但front.next将是null. 在这种情况下,您应该设置front为。null
  3. 对于以上任何一项,您都应该next最后一个条目的 设置为null。你还没有设法做到这一点。
于 2013-03-05T23:30:17.310 回答
2

您只是将本地参考设置currentnull; 你没有改变你的清单。

假设这是一个单链表,您需要将倒数第二个ListNode设置nextnull(或者如果它是唯一的项目,则设置为)frontnull

于 2013-03-05T23:25:27.480 回答
0

记住具有空指针的节点之前的“当前”,并将该节点的“下一个”指针设置为空。这样,您将删除对最新节点的引用,而不仅仅是更新局部变量。

于 2013-03-05T23:29:29.857 回答
0

我在这里解释了这一点。

Jave 是一种按引用传递的语言并=重新分配引用。您只是在更改本地引用,请参阅上面链接中的示例代码并理解这一点。

于 2013-03-05T23:27:00.477 回答
0

试试这个

public int delete(){

    if(front==null){

        throw new NoSuchElementException(); 

    } else if(front.next===null){
           return front.data;
}else{

       ListNode current = front;

       while(current.next.next!=null){
          current = current.next;   
       }

       int deleted_node = current.next.data;
       current.next = null;
       return deleted_node;
    } 
}
于 2019-08-07T02:03:48.340 回答