在 link 列表中的给定位置插入,在我们需要的代码中 (pos-2)
Insert at given position in link list , in code why we need (pos-2)
在下面给出的代码中,我们在给定位置插入一个节点。
我的问题是:为什么我们需要在for
条件下使用pos-2
?
insertNode(Node *head,int pos,int data)
{
Node *temp=new Node(data);
if(pos==1)
{
temp->next=head;
return temp;
}
Node * curr=head;
for(int i=1;i<=pos-2 && curr!=NULL ;i++)
curr=curr->next;
if(curr==NULL)
return head;
temp->next=curr->next;
curr->next=temp;
return head;
}
一些注意事项:
我们希望curr
指向之前要插入新节点的位置的节点。这是因为我们将使用 curr->next=temp
进行插入,其中 temp
是新节点。
由于头节点没有前驱,属于特例。当 pos
为 1.
时会发生这种情况
当pos
为2时,前一个节点为头节点。由于 curr
被初始化为 head
,它不应该移动。因此对于这种情况,我们也不希望循环进行任何迭代。
当pos
为3时,前面的节点是链表中的第二个节点。由于 curr
指向 head
,它需要向前迈出一步,即循环应该只迭代一次。当您将 for
条件设置为 <=pos-2
.
时,会发生这种情况
或者,你可以推断我们已经处理了 pos
为 1 的情况,所以我们可以让循环从 pos=2
开始,然后我们也可以替换 <=
和 <
表示我们想要到达 preceding 位置,而不是 at 位置。现在循环 header 看起来像这样:
for (int i = 2; i < pos && curr != NULL; i++)
这执行相同次数的迭代,但可能更具可读性。
我希望这能解释清楚。
在下面给出的代码中,我们在给定位置插入一个节点。
我的问题是:为什么我们需要在for
条件下使用pos-2
?
insertNode(Node *head,int pos,int data)
{
Node *temp=new Node(data);
if(pos==1)
{
temp->next=head;
return temp;
}
Node * curr=head;
for(int i=1;i<=pos-2 && curr!=NULL ;i++)
curr=curr->next;
if(curr==NULL)
return head;
temp->next=curr->next;
curr->next=temp;
return head;
}
一些注意事项:
我们希望curr
指向之前要插入新节点的位置的节点。这是因为我们将使用 curr->next=temp
进行插入,其中 temp
是新节点。
由于头节点没有前驱,属于特例。当 pos
为 1.
当pos
为2时,前一个节点为头节点。由于 curr
被初始化为 head
,它不应该移动。因此对于这种情况,我们也不希望循环进行任何迭代。
当pos
为3时,前面的节点是链表中的第二个节点。由于 curr
指向 head
,它需要向前迈出一步,即循环应该只迭代一次。当您将 for
条件设置为 <=pos-2
.
或者,你可以推断我们已经处理了 pos
为 1 的情况,所以我们可以让循环从 pos=2
开始,然后我们也可以替换 <=
和 <
表示我们想要到达 preceding 位置,而不是 at 位置。现在循环 header 看起来像这样:
for (int i = 2; i < pos && curr != NULL; i++)
这执行相同次数的迭代,但可能更具可读性。
我希望这能解释清楚。