C++链表节点结构及InsertAfter函数逻辑理解困惑
C++单链表核心问题拆解
一、节点的声明方式为什么特殊?
单链表的节点是自定义复合类型,和普通变量(比如int num)的本质区别是:它需要同时存储数据和下一个节点的地址,所以必须包含一个指向自身类型的指针,也就是自引用结构。常见的声明形式如下:
struct Node { // 存储节点数据 int data; // 指向同类型下一个节点的指针,用来串联链表 Node* next; // 构造函数,初始化数据和指针 Node(int val) : data(val), next(nullptr) {} };
普通变量只存单一值,而节点是把数据和“链接信息”打包在一起的结构,Node* next就是用来记录下一个节点的内存地址,这样才能把多个节点串成链表。
二、this->到底有什么用?
this是C++成员函数里的隐含指针,它指向当前调用这个成员函数的对象。比如你写headObj->InsertAfter(...),在InsertAfter函数里,this就等价于headObj。
- 当成员变量和函数参数/局部变量同名时,必须用
this->明确区分:比如函数里有参数next,那this->next才是当前对象的next成员,而不是参数next。 - 即使没有同名冲突,写
this->也能让代码更清晰,一眼看出是访问当前对象的成员。
三、InsertAfter函数的执行逻辑与指针变化
假设我们给Node结构体加上InsertAfter成员函数,用来在当前节点后面插入新节点,代码如下:
void InsertAfter(int val) { // 1. 创建新节点,初始化数据,next默认指向nullptr Node* newNode = new Node(val); // 2. 让新节点的next指向当前节点原来的后继节点 newNode->next = this->next; // 3. 让当前节点的next改为指向新节点 this->next = newNode; }
举个具体的指针变化例子:
初始链表状态:headObj -> node1 -> nullptr
headObj的data=5,next存储的是node1的内存地址node1的data=7,next=nullptr
当调用headObj->InsertAfter(10)时:
- 新建
newNode,data=10,next=nullptr newNode->next = this->next:this是headObj,所以this->next是node1的地址,现在newNode->next指向node1this->next = newNode:把headObj的next改成newNode的地址
最终链表变成:headObj -> newNode -> node1 -> nullptr
注意顺序不能反:如果先改this->next = newNode,再给newNode->next赋值,就会丢失node1的地址,导致链表断裂。
内容的提问来源于stack exchange,提问作者droid
相关产品推荐
相关产品推荐

