2014-04-07 44 views
2

此代码是一个可以选择惰性名称,删除,显示和退出的表格。java - 如何从链表中删除节点?

这个代码运行的很好,但我唯一的问题是如何在一个节点

class Node{ 

Node in; 
String name; 

public Node(){ 

    in = null; 

} 

public Node(String n){ 

    in = null; 
    name = n; 

} 

public void setIn(Node n){ 

    in = n; 

} 

public Node getIn(){ 

    return in; 

} 

public void setName(String n){ 

    name = n; 

} 

public String getName(){ 

    return name; 

} 




public class Main{ 

public static void main(String args[]){ 
    Scanner scan = new Scanner(System.in); 
    LinkedList bi = new LinkedList(); 
    while(true){ 

     System.out.println("Choose!\n[a] Insert Name\n[b] Delete\n[c] Show\n[d] Exit"); 
     char c = scan.next().charAt(0); 
     System.out.println(); 

     if(c == 'a'){ 

      System.out.print("Enter Name: "); 
      bi.insert(scan.next()); 
      System.out.println(); 

     } 
     else if(c == 'b'){ 

      System.out.print("Enter Name to delete: "); 
      bi.delete(scan.next()); 
      System.out.println(); 
     } 
     else if(c == 'c'){ 

      bi.show(); 
      System.out.println(); 

     } 
     else if(c == 'd'){ 

      System.exit(0); 

     } 

    } 

} 

    } 


class LinkedList{ 

private Node root; 

public LinkedList(){ 

    root = null; 
} 

public void insert(String n){ 

    root = insert(root, n); 

} 

private Node insert(Node n, String r){ 

    if(n == null){ 

     n = new Node(r); 

    } 
    else{ 

     n.in = insert(n.in, r); 

    } 

    return n; 

} 

public void delete(String n){ 

    root = delete(root, n); 

} 

private Node delete(Node n, String r){ 




} 

public void show(){ 

    show(root); 

} 

private Node show(Node n){ 
    if(n == null){ 

     System.out.println("Empy list!"); 

    } 
    else{ 

     while(n!=null){ 

      System.out.println(n.getName()); 
      n = n.getIn(); 

     } 

    } 

    return n; 
} 

} 

*我不知道如何删除一个节点删除一个选择的名称。我应该把我的删除方法?

public void delete(String n){ 

    root = delete(root, n); 

} 

private Node delete(Node n, String r){ 




} 
+0

正如其他人所说,先试一试。提示:在搜索要删除的节点时,使用两个指针遍历列表。 – Inertiatic

回答

2

要删除节点,您实际需要更新它的上一个节点,以便删除节点,并且单独的节点最终会收集垃圾。

如果要删除的节点是根节点而不是更新根节点,那么只捕获一个节点。

private Node delete(Node root, String data) 
{ 
    Node n=null; 
    //in case list is empty then return 
    if(root==null) return n; 
    if (root.name.equals(data)) 
    { 
     n = root; 
     root = null; 
     return n; 
    } 
    while(root.in!=null) 
    { 
     if (root.in.name.equals(data)) 
     { 
      //save the reference 
      n=root.in; 

      //making root.in to be garbage collected 
      root.in = root.in.in; 

      break; 
     } 
     root = root.in; 
    } 

    return n; 
} 
+0

那么这是快速肮脏,但你应该尝试先草绘事情,然后再问几次试试:) –

+0

好的工作(不!)。现在,他可以将您的代码复制到他的作业中... –

+2

学习和理解的一种方式是通过代码流以及...只是希望他在复制之前尝试了解它... –

0

您是试图从节点中删除名称,还是从列表中删除节点?要从列表中删除节点,请使用LinkedList.remove(int index)方法。您需要首先找到要删除的节点的索引。

与其他人一样,你应该尝试自己解决问题,但这里有个提示:你可以用LinkedList.get(int index)访问每个节点。您可以使用LinkedList.size()获取列表的长度。这可能是“for”循环的好地方。

+1

这就是我的问题所在。我不知道如何。 你能给我一个样品吗? – user3505049

+1

@ user3505049 - 您不需要样本。按照我的答案中的建议。 –

3

我们可以为你编码,但这没有意义。

相反,我会建议您在纸上绘制链表数据结构,使用框表示节点的列表节点和字段,以及指针/引用的箭头。然后为算法的局部变量绘制更多的框......并“手执”它。这将帮助你形象化你的代码应该在做什么。

一旦你做这种事情了几次,你就可以在你的脑袋想象......


可以请你给我一个样品?

对不起,但是没有。您将通过为自己工作了解更多。往上看。

+0

如果你会给我一个样本,那么我可以在之后进行练习。 – user3505049

+0

我已经回答了。 –