You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表指定位置插入节点的代码中,循环条件为何需使用pos-2?

为什么链表指定位置插入节点的代码中循环条件要用pos-2?

我有一段实现链表指定位置插入节点的C++代码:

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

我的问题是:为什么上述代码的循环条件中需要使用pos-2?

这其实和链表的位置计数逻辑直接相关,咱们一步步拆解就明白了:

首先,这段代码里的pos是从1开始计数的(比如pos=1就是链表的第一个节点位置)。当我们要在pos位置插入新节点时,核心是找到pos位置的前驱节点——也就是pos-1位置的节点,因为新节点要插在它的后面,让它的next指向新节点,新节点的next指向原来pos位置的节点。

那我们初始的curr是指向head的,也就是pos=1的节点。现在要让curr最终停在pos-1的节点上:

  • 举个例子,如果要插入到pos=3的位置,我们需要curr走到pos=2的节点(也就是前驱节点)。初始curr在pos=1,只需要走1步就到pos=2。这时候pos-2=3-2=1,循环条件i<=1刚好让循环执行1次,完美走到目标节点。
  • 再比如pos=4,前驱节点是pos=3,初始curr在pos=1,需要走2步。pos-2=4-2=2,循环执行2次,正好到达pos=3的节点。

如果把循环条件改成pos-1会怎么样?那还是以pos=3为例,pos-1=2,循环会执行2次,curr会走到pos=3的节点(也就是原本要插入的位置),这时候再执行curr->next=temp就错了——我们需要的是前驱节点的next指向新节点,而不是目标位置节点的next。

另外,循环里还加了curr!=NULL的判断,是为了防止pos超过链表长度的情况,避免空指针访问。

总结一下:循环条件用pos-2,是为了让curr从head(pos=1)出发,刚好走到pos-1的前驱节点,为后续的插入操作做好准备。

内容的提问来源于stack exchange,提问作者Gourav Gassi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:52:42