【问题标题】:java - how to delete a node from linkedlist?java - 如何从链表中删除一个节点?
【发布时间】:2014-04-07 03:00:47
【问题描述】:

此代码是一个表,其中包含 Inert name、delete、show 和 quit 选项。

这段代码运行良好,但我唯一的问题是如何删除节点中选择的名称

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){




}

【问题讨论】:

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

标签: java linked-list


【解决方案1】:

我们可以为您编写代码,但没有抓住重点。

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

这样的事情做几次之后,你就能在脑海中想象……


你能给我一个样品吗?

抱歉,不可以。您将通过自己解决来了解更多信息。见上文。

【讨论】:

    【解决方案2】:

    要删除节点,您实际上需要更新它的前一个节点,才能删除节点,而剩下的节点最终会被垃圾回收。

    如果要删除的节点是根节点,那么就更新根节点。

    private Node delete(Node root, String data)
    {
        //in case list is empty then return
        if(root==null) return n;
        //in case node to be deleted is root then just return next as new root
        if (root.name.equals(data)) return root.in;
    
        Node curr = root;
        while(curr.in!=null)
        {
            if (curr.in.name.equals(data))
            {
                //curr.in's referenced Node will be garbage collected (or run some cleanup manually on it)
                curr.in = curr.in.in;
                //we are done and root is same
                return root;
            }
            curr = curr.in;
        }
        //if here then not found and nothing changed
        return root;
    }
    

    【讨论】:

    • root = null 它不会在函数内部做任何事情。 Java 是按值传递的,而不是按引用传递
    【解决方案3】:
    while (node != null) {
    
                if (node.getNext() == null || head.getNext() == null) {
                    break;
    
                } else if (head.getData() == data) {
                    head = head.getNext();
                } else if (node.getNext().getData()==null&&data==null||node.getNext().getData().equals(data)) {
                    node.setNext(node.getNext().getNext());
                } else {
                    node = node.getNext();
                }
            }
        }
    
        return head;
    

    【讨论】:

    • 欢迎来到 SO!当你只用代码回复时,试着解释一下。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-05
      • 2020-02-26
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多