这只是一个愚蠢的问题, 为什么在删除元素时我会遇到异常...... 我刚刚在同学中看到这段代码,当我运行代码并选择DELETE时,我得到了NULLPOINTEREXCEPTION
顺便说一下代码......(我得到错误的地方)
if(!(head.data).equals(del))
{
tail=head;
Node temp=head.next;
while(temp!=null)
{
if((temp.data).equals(del))
{
tail.next=temp.next;
size--;
break;
}
tail=temp;
temp=temp.next;
}
}
else
{
head=head.next;
}
}
else
{
System.out.println("LinkedList is empty");
}
break;
我很高兴有人可以帮助我......
完整代码。 import java.io. *; import java.util.LinkedList;
public class Main
{
public static void main(String[]args) throws Exception
{
BufferedReader x = new BufferedReader(new InputStreamReader(System.in));
LinkedList<String> list = new LinkedList<>();
list.add("Jarn");
list.add("Zhai");
System.out.println("List:..");
//System.out.println();
System.out.println(list);
System.out.println();
String ch,in,fi,del;
boolean kita = false;
int size=0,data;
Node head=null, tail=head;
do
{
System.out.println("Choose Option.\n1-Insert\n2-Delete\n3-Dispay\n4-Find\n5-Quit");
System.out.println();
System.out.println("Choice: ");
ch=x.readLine();
System.out.println();
switch (ch)
{
case "1":
System.out.println("Enter Name you Want to Insert..");
in=x.readLine();
list.addLast(in);
System.out.println("Name "+in+" was successfully inserted..");
System.out.println();
break;
case "2":
if(size>=0)
{
System.out.println("Enter name to del..");
del=x.readLine();
if(!(head.data).equals(del))
{
tail=head;
Node temp=head.next;
while(temp!=null)
{
if((temp.data).equals(del))
{
tail.next=temp.next;
size--;
break;
}
tail=temp;
temp=temp.next;
}
}
else
{
head=head.next;
}
}
else
{
System.out.println("LinkedList is empty");
}
break;
case "3":
System.out.println("List..");
System.out.println();
System.out.println(list);
break;
case "4":
System.out.println("Enter name You Want to Find..");
fi=x.readLine();
while(size!=(list.size()))
{
String temp = list.get(size);
if(temp.equalsIgnoreCase(fi))
{
kita=true;
}
size++;
}
if(kita)
{
System.out.println("Name: "+fi+" exists!.");
System.out.println();
}
else
{
System.out.println("Name: "+fi+" not found!.");
System.out.println();
}
break;
case "5":
System.out.println("Thank You..");
break;
default:
System.out.println("INVALID OPTION..");
System.out.println();
break;
}
}
while(!ch.equals("5"));
}
class Node
{
String data;
Node next;
Node(String d)// node class Constructor.
{
data = d;
next= null;
}
}
}
答案 0 :(得分:2)
感觉就像是在尝试将自定义链表与Java Collections Framework中的LinkedList
混合。这可能让你很困惑。
事实证明,List
指定了remove(Object o)
功能,可让您更直接地删除更多的内容。
这会将你的删除函数 case语句转换为:
System.out.println("Enter name to del..");
String del=x.readLine();
boolean removed = list.remove(del);
if(removed) {
System.out.println(del + " was removed successfully.");
} else {
System.out.println(del + " isn't in the list!");
}
...从那里,您可以完全忘记关于整个自定义Node
业务。它没有添加任何内容。
注意:del
未被定义为原始代码中的有效变量,并且您不太可能再次需要它。它可以内联,但我觉得这更好地说明了合成流程。
不可否认,我们强烈认为这是一项旨在让您设计自己的链接列表结构的任务,但我会对此进行三重检查,并与您的教授/ TA进行协商。
答案 1 :(得分:-1)
在删除之前,你需要找到要删除的元素。 使用while循环。
而(current.data!= n)的
{
prev=current;
current=current.link;
}