LinkedList中的NullPointer异常

时间:2014-01-12 04:51:42

标签: java nullpointerexception linked-list nodes singly-linked-list

这只是一个愚蠢的问题,  为什么在删除元素时我会遇到异常......  我刚刚在同学中看到这段代码,当我运行代码并选择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;   
  }  

}

}

2 个答案:

答案 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;

        }