java – 如何从linkedlist中删除节点?

此代码是一个表,其中包含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){ } 

要删除节点,您实际上需要更新它的上一个节点才能删除节点,并且左侧单独的节点最终将被垃圾收集。

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

 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; } 

我们可以为您编写代码,但是错过了重点。

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

一旦你完成了几次这样的事情,你就能在脑海中形象化……


你能给我一个样品吗?

对不起,但不会。您将通过自己动手来了解更多信息。 往上看。

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

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