单链表各个节点的关系,单链表的中间节点

首页 > 经验 > 作者:YD1662022-11-04 00:27:00


那这个问题就是我前面说过的不带头结点链表和带头结点链表的问题。这里我们申请的是不带头结点的链表,head指针开始时NULL,因为链表为空,它没有结点可以指向。所以在进入尾插函数,用把head赋值给了tail,tail也为空,也就不能进行“->”这样的操作。
那么你可能会想,那直接把newNode的值赋值给tail就可以了,但是需要明白,tail确实此时会指向newNode,但是head还处于游离状态,如果不能把head指向第一个结点,那么这个链表等于没有构造,因为“火车头”都按不上,还能叫火车吗?
所以这里就必须分为两种情况,这就是不带头结点的链表的一个小弊端,也就体现在插入第一个结点时的这种尴尬情况。所以改写如下

单链表各个节点的关系,单链表的中间节点(9)


但是运行之后,依旧没有东西

单链表各个节点的关系,单链表的中间节点(10)


仍然通过调试,一探究竟

单链表各个节点的关系,单链表的中间节点(11)


可以发现,进入尾插函数后,把NeNode值赋值给了Phead,但是head依旧没变,所以就不可能打印。
所以这也是大多数人最容易犯错的地方,因为我们对于指针的第一印象,总感觉它是万能的,但是我们没有意识到一点是,指针为什么能发挥作用?这是因为指针的解引用操作。
但凡是学过C语言的人,在接触指针这一节时,绝对会知道一个关于指针交换变量的值的例子。如果传值就不能交换,而为什么传值,或者是什么情况下叫做传值,这个问题是很多人没有想过的。这里我的体会是,调用函数时传入的变量的类型和形参接受的变量的类型一致时这就是传值,所以我们上述尾插时,传入尾插函数的是一级指针变量,被调函数形参也用一级指针接受,所以一旦涉及到赋值操作,也就是上面的phead=NewNode,就不可能成功,相反咱们在else语句中写的那个却是正确的,因为此时我们拿到一级指针没有用它来赋值,而是进行解引用,也就是指针的本职工作。但是为什么最后依旧没有输出呢,就是因为第一次这个特殊情况,head没有被修改,自然而然整个队列都找不见。
经过以上分析,改写如下

单链表各个节点的关系,单链表的中间节点(12)

上一页12345下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.