1

我正在尝试编写一种方法来删除链接列表中的最后一个节点(用于学习如何修改链接列表..我没有使用 java 库 LinkedList 类)..我试图处理传递的链接列表只有的用例一个节点。

但是,当我尝试在删除之前和之后打印链接列表时,它会提供与未删除节点相同的输出。

class NodeProcessing{
    public static void removeLastNode(Node f){
        if (f==null) return;
        if(f.next == null){//if linkedlist has single node
            f = null;
            return;
        }
        ...
    }

    public static void showList(Node first){
        System.out.println("linked list=");
        for(Node x = first; x != null; x = x.next){
            System.out.print(x.item+" ,");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node a = new Node();
        a.item = "one";
        showList(a);
        removeLastNode(a);
        showList(a);
    }

}
class Node{
    String item;
    Node next;
}

输出:

链表=一个,

链表=一个,

更新:当我使用调试器时,我可以看到里面Node amain()地址:Node@a61164 并且Node f里面removeLastNode()也有:Node@a61164

4

3 回答 3

6

设置f为 null 什么都不做 - 只会更改参数的值,它只是一个局部变量。重要的是要了解 Java 始终对参数使用按值传递 - 当参数类型是类类型时,值是引用,但该引用是按值传递的。将参数值更改为不同的引用不会更改调用者的参数。

理想情况下,您希望将“列表”的概念与“列表中的节点”分开(就像 Java API 所做的那样)。这样,当您调用remove列表,它会改变列表本身。在您当前的“节点只是列表的头部”模型中,您无法删除最终节点 - 您无法销毁节点本身。

您最接近的方法是removeLastNode 返回一个Node引用 -null如果名义列表现在为空,它可能会返回。

于 2013-06-19T05:55:47.247 回答
1

节点 f 是以下方法中的局部变量

public static void removeLastNode(Node f)

由于它是对实际参数的引用的副本,因此对参数所做的更改不会影响参数。

你在做

f = null

然而

Node first

仍将指向现有节点。您正在使用参数打印链接列表,因此结果。

于 2013-06-19T05:56:59.727 回答
0

您可以使用 java 提供的 LinkedList 数据结构来执行此操作。

    LinkedList items = new LinkedList();
    items.add("one");
    items.add("two");

    System.out.println(items);
    items.removeLast();
    System.out.println(items);

这将生成所需的输出。

于 2013-06-19T05:57:03.673 回答