我正在尝试编写一个方法来删除一个链表中的最后一个节点(用于学习如何修改一个链表......我没有使用java库的LinkedList类)..我试图处理用例所在的用例linkedlist只有一个Node。
但是,当我尝试在删除之前和之后打印链表时,它会提供与未删除节点相同的输出。
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 a
中的main()
有地址:Node@a61164
Node f
内的removeLastNode()
也有:Node@a61164
答案 0 :(得分:6)
将f
设置为null不会做任何事情 - 只会更改参数的值,这只是一个局部变量。重要的是要理解Java总是使用值的传值 - 当参数类型是类类型时,值是引用,但该引用是按值传递的。将参数值更改为其他引用不会更改调用者的参数。
理想情况下,您希望将“列表”的概念与“列表中的节点”分开(就像Java API一样)。这样,当您在列表上调用remove
时,它会改变列表本身。在您当前的模型“节点只是列表的头部”中,您无法删除最终节点 - 您无法破坏节点本身。
您最接近的方法是让removeLastNode
返回 Node
引用 - 如果名义列表现在为空,则可以返回null
。< / p>
答案 1 :(得分:1)
节点f是以下方法中的局部变量
public static void removeLastNode(Node f)
由于它是对实际参数的引用的副本,因此对参数所做的更改不会影响参数。
你正在做什么f = null
其中
Node first
仍将指向现有节点。 您正在使用参数打印链表,因此结果。
答案 2 :(得分:0)
您可以使用java提供的Linked List数据结构来执行此操作。
LinkedList items = new LinkedList();
items.add("one");
items.add("two");
System.out.println(items);
items.removeLast();
System.out.println(items);
这将生成所需的输出。