改进
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
是列表的新头部,应该返回。
i: 0
i: 0
i: 1
i: 0
i: 1
i: 2
i: 3
改进
你总是需要创建一个新的Node,所以重构它使你的代码更干净。
您不需要
start == null
检查,因为每当position == 0
. 时,您只需将旧头部(可能是
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;
}
}