此代码是一个包含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){
}
答案 0 :(得分:4)
我们可以为您编写代码,但是错过了重点。
相反,我将建议您使用列表节点和节点字段的框以及指针/引用的箭头在纸上绘制链接列表数据结构。然后为你的算法的局部变量绘制更多的框......和"手执行"它。这将有助于您可视化应该正在做什么的代码。
一旦你完成了几次这样的事情,你就能在脑海中形象化......
你能给我一个样品吗?
抱歉,但不会。您将通过自己动手来了解更多信息。见上文。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
您是否尝试从节点中删除名称,或从列表中删除该节点?要从列表中删除节点,请使用LinkedList.remove(int index)方法。您需要先找到要删除的节点的索引。
[edit]就像其他人所说的那样,你应该尝试自己解决问题,但这里有一个提示:你可以使用LinkedList.get(int index)访问每个节点。您可以使用LinkedList.size()获取列表的长度。这可能是“for”循环的好地方。
答案 3 :(得分:0)
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;