链表指定位置插入节点的代码中,循环条件为何需使用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
相关产品推荐
相关产品推荐

