线性链表插入节点取pos-1(i-1)位置的个人理解

线性链表插入节点取pos-1(i-1)位置的个人理解,第1张

bool insert_list(strcut node * pHead ,int pos ,int val)

struct node * p = pHead;

int i = 0; //注意i 的值就是p指向的链表的实际位置,此时p指向头结点(不是头结点的指针域)i=0

while(NULL != p&&i < pos-1)

{

p = p->next;

i++;// p指向第一个节点 ,i=1。p指向第n个节点,i=n。(这两步没有先后顺序,视为同时进行的 *** 作,所以如果i=pos-1,p就指向第pos-1个节点)

}

if(i > pos-1 || p = NULL)

return false;

一、为什么p是从头结点开始的

当pos=1时,要找pos-1位置即头结点,如果 p->pHead->pNext 那么指针已经指向第一个节点,无法对pos-1(头结点)的指针域 *** 作,也就无法插入一个新节点。

二、while循环,&&语句只要有一个不成立,就退出。一共有三种情况。假设A条件为 NULL!=p,B条件为i < pos-1。

1、A不成立,B不成立

A不成立就是p指向了NULL,B不成立就是i=pos-1。

意思是p指向了NULL,并且p指向的位置是pos-1,画图可以看出这个条件是无法进行插入的。

2、A不成立,B成立

A不成立就是p指向了NULL,B成立就是说i

意思是在pos-1的位置前就有节点指向NULL,比情况1还要离谱一点。

3、A成立,B不成立

A成立就是p并未指向NULL,B不成立就是说i=pos-1。

意思是p指向的节点非空,并且p指向的位置是pos-1,满足插入的条件。

三、if语句

i > pos-1这个条件主要为了排除pos为负数的情况,i的目的就是为了寻找pos-1的位置,i>pos-1的话i本身也没什么意义。

p==NULL排除了上面while循环的前两种情况,保留最后一种情况。

执行完循环和if语句后,p指向pos-1这个位置且pos-1不为NULL,符合插入的条件。

四、随便说几句

以上均为我个人的理解,写这个一是为了以后回顾,二是希望能帮助到不理解这个算法的人。我也是初学这个算法,以上如果有错误之处,麻烦大家指正,防止我这个新手误导了别人。本文如果能帮助到你,我会很开心的。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/742329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存