在 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++)

这执行相同次数的迭代,但可能更具可读性。

我希望这能解释清楚。