链接列表插入中间

时间:2015-07-29 17:31:59

标签: java data-structures linked-list insertion

${line##*_}

在上面的代码中,我打印了" i"的值。在for循环中。 在控制台中,我将输出作为

$ while read line; do line=${line%%Match[Ffile]*}; line=${line##*_}; echo $line; done < filename
Accounts
AdGroup
Ads
Advertisers
Audience

并且

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;
    } 
}

为什么&#34;我&#34;没有正确递增?如果它运作良好,那么我可以在中间执行插入。

2 个答案:

答案 0 :(得分:2)

问题不在于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次意味着你的方法被称为三次,而不是你想的一次。

为了编写正确的代码,请确保{for循环中start不为空。我没有尝试更改您的代码,只是添加了使其工作所需的内容。

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;
    } 
 }

答案 1 :(得分:1)

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

其次,你的循环是正确的。但是,Hackerrank 运行多个测试用例。我键入了一个解决方案,并在方法调用的开头插入换行符。您只需执行三个测试用例。

i: 0

i: 0
i: 1

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

改进

  1. 您将始终必须创建一个新节点,以便重构以使您的代码更清晰。

  2. 您不需要start == null检查,因为只要null,您只需将旧头(可能是position == 0)附加到末尾。

  3. 插入改进后:

    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;
        } 
    }