使用java删除链表中的节点

dam*_*mon 1 java linked-list nodes

我正在尝试编写一个方法来删除链表中的最后一个节点(用于学习如何修改链表...我没有使用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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

链表=一,

链表=一,

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

Jon*_*eet 6

设置f为null不执行任何操作 - 只更改参数的值,这只是一个局部变量.重要的是要理解Java总是使用值的传值 - 当参数类型是类类型时,值是引用,但该引用是按值传递的.将参数值更改为其他引用不会更改调用者的参数.

理想情况下,您希望将"列表"的概念与"列表中的节点"分开(就像Java API一样).当你调用这样remove一个对列表,发生变异的名单本身.在您当前的模型"节点只是列表的头部"中,您无法删除最终节点 - 您无法破坏节点本身.

你最接近的将是removeLastNode 返回一个Node引用 - null如果名义列表现在为空,则可以返回.