2013-06-19 149 views
1

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

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

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()有地址:[email protected]Node f里面的removeLastNode()也有: [email protected]

+0

您会发现,在您参考或按价值思考后,这是一个常见问题。当您在方法“removeLastNode”中设置节点空值时,它只是将复制引用“f”设置为空,实际节点“a”总是指向实际值。顺便说一下,您可以更改Node.item在你的Method.You可能会发现一些堆和堆栈的细节来寻找答案。 – Sstx

回答

6

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

理想情况下,您希望将“列表”的概念与“列表中的某个节点”分开(就像Java API一样)。通过这种方式,当您在列表上调用remove时,它会将列表本身变为。在当前的“节点仅仅是列表的头部”模型中,您无法删除最终节点 - 您无法销毁节点本身。

你能来是使removeLastNode一个Node参考最近的 - 这可能返回null如果名义名单现在是空的。

+0

除了Jon的回答之外,建议您在删除节点后将已删除的元素设置为null。这将有助于避免内存泄漏。 – Atul

1

节点F是在下述方法

public static void removeLastNode(Node f) 

局部变量既然是参照实际参数的副本,对参数进行的更改不会影响的参数。

你正在做

f = null 

其中作为

Node first 

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

0

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

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

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

这将生成所需的输出。

+0

我想学习如何编写/从头开始编辑链表..所以我有意识地避免java的LinkedList – damon

+0

我应该删除这个答案吗? –

+0

实际上,我曾尝试过这样,当我不知道java中的链表时,所以认为你可能遇到过类似的问题 –