在中间插入链表


Node InsertNth(Node head, int data, int position) {

    Node start,curr,temp;
    start=head;
    curr=start;
    if(start==null)
        {
        temp=new Node();
        temp.data=data;
        temp.next=null;
        return head;
    }
    else if(position==0)
        {
        temp=new Node();
        temp.data=data;
        temp.next=start;
        return head;
    }
    else
        {
        for(int i=0;i<position;i++)
            {
            System.out.println("i:"+i);
            curr=start;
            start=start.next;
        }
        temp=new Node();
        temp.data=data;
        curr.next=temp;
        temp.next=start;
        return head;
    } 
}
在上面的代码中,我在for循环中打印了"I"的值。在控制台中,我得到的输出为
i:0
i:0
i:1
i:0
i:1
i:2
i:3

Exception in thread "main" java.lang.NullPointerException
    at Node.InsertNth(Solution.java:49)
    at Solution.main(Solution.java:88)

为什么"i"没有正确地递增?如果效果很好,我可以在中间插入

问题不是与for循环,问题是:方法被调用3次

我刚把你的部分代码改成:

else
{
    int count =0;
    for(int i=0;i<position;i++)
        {
        try{
        System.out.println("i :" +i);
        curr=start;
        start=start.next;
            count++;
        }
        catch(Exception e){
        }
    }
    System.out.println("count: " +count);
    temp=new Node();
    temp.data=data;
    curr.next=temp;
    temp.next=start;
    return head;
} 

并在hackerrank中提交,它打印:

i :0
count: 1
i :0
i :1
count: 2
i :0
i :1
i :2
i :3
count: 3

正在打印

    System.out.println("count: " +count);

3次意味着你的方法被调用了三次,而不是你想的一次。

要编写正确的代码,只需确保start在for循环中不为空。我并没有试图改变你的代码,只是添加了必要的东西,使其工作。

Node InsertNth(Node head, int data, int position) {
     Node start,curr,temp;
     start=head;
     curr=start;
     if(start==null || position == 0)
     {
        temp=new Node();
        temp.data=data;
        temp.next=start;
        head=temp;
        return head;
     }
     else
    {
        for(int i=0;i<position && start!=null ;i++)
        {
         curr=start;
         start=start.next;
        }
        temp=new Node();
        temp.data=data;
        curr.next=temp;
        temp.next=start;
        return head;
    } 
 }

首先,为什么return head;在你的前两个案例中?temp是列表的新头部,应该返回。

其次,你的循环是正确的。然而,Hackerrank 运行多个测试用例。我输入了一个解决方案,并在方法调用的开头插入了换行符。您只需要执行三个测试用例。
i: 0
i: 0
i: 1
i: 0
i: 1
i: 2
i: 3

改进
  1. 你总是需要创建一个新的Node,所以重构它使你的代码更干净。

  2. 您不需要start == null检查,因为每当position == 0 .

  3. 时,您只需将旧头部(可能是null)附加到末尾。

插入改进:

Node InsertNth(Node head, int data, int position) {
    Node temp = new Node();
    temp.data = data;
    Node start = head;
    Node curr = start;
    if (position == 0)
    {
        temp.next = start;
        return temp;
    } 
    else
    {
        for(int i = 0; i < position; i++)
        {
            curr=start;
            start=start.next;
        }
        curr.next=temp;
        temp.next=start;
        return head;
    } 
}

相关内容

  • 没有找到相关文章

最新更新