链接列表在已排序的链接列表中插入节点

时间:2017-04-15 08:29:28

标签: java sorting linked-list

强调文本我需要传递LINKED LIST的标题和要插入该链表的数据。假设列表按排序顺序我需要检查每个节点的数据并插入新节点给出新排序的清单。

我得到空指针异常,我需要知道我做错了什么

/*
  Insert Node at the end of a linked list 
  head pointer input could be NULL as well for empty list
  Node is defined as 
  class Node {
     int data;
     Node next;
     Node prev;
  }
*/

Node SortedInsert(Node head,int data) {
    Node root= head;
    if(head==null){
        root.data=data;
        root.next=null;
        root.prev=null;

    }else if(head.data>data){
            Node newnode = new Node();
           newnode.data=data;
           newnode.next=head;
           newnode.prev=null;
            head.prev=newnode;
            root=newnode;
        }
    int k=0;
    while(head!=null && k==0){

        if(head.data<data && head.next.data>data && head.next!=null){
           Node temp=head.next;
           Node newnode = new Node();
           newnode.data=data;
           newnode.next=temp;
           newnode.prev=head;
           head.next=newnode;
           temp.prev=newnode;k++; break;
       }
        else if(head.data<data && head.next==null){
           //Node temp=head.next;
           Node newnode = new Node();
           newnode.data=data;
           newnode.next=null;
           newnode.prev=head;
           head.next=newnode;k++;break;
           //temp.prev=newnode;
       }else 
       {head=head.next;}

    }
  return root;
}
  

我在循环中的第二个if语句中获取空指针异常。

2 个答案:

答案 0 :(得分:0)

 Node root= head;
if(head==null){
    root.data=data;

这里你试图为空对象设置数据 你应该先为root分配内存 e.g。

head = new Node();
root = head
//then continue your code

答案 1 :(得分:0)

我在您的代码中发现了一些可能会给出NullPointerException的错误。因此请相应更改。

首先出现的错误是:

Node root= head;
if(head==null){
    root.data=data;
    root.next=null;
    root.prev=null;
}

所以在这里你需要首先创建一个Node类的对象并将其分配给root,这样代码将如下所示:

Node root= head;
if(head==null){
    root=new Node();
    root.data=data;
    root.next=null;
    root.prev=null;
}

我遇到的另一个错误是if(head.data<data && head.next.data>data && head.next!=null)。 在head.next访问之前,您应该验证head.next.data。 假设head.nextnull,那么循环condition的评估就是这样。

1) head.data<data所以假设返回true,我们会检查下一个条件。

2) head.next.data>data现在如果head.nextnull,则此处条件为null.data,这将引发NullPointerException。所以在这里你还应该检查head.next是否为空。你这样做是下一个条件,但它在验证之前就已经执行了。

所以在这里你只需要更改if语句的条件顺序,如:if(head.data<data && head.next!=null && head.next.data>data)

这将解决您的问题。