C++链表插入,为什么头节点必须是二位指针
来源:互联网 发布:用户和数据库的接口 编辑:程序博客网 时间:2024/06/08 00:03
C++中正确插入链表节点的代码如下:
struct ListNode{ int m_value; ListNode * m_next;};void addListNode(**ListNode ** pHead**, int value){ ListNode * pNew = new ListNode(); pNew->m_value = value; pNew->m_next = NULL; if (*pHead == NULL) { *pHead = pNew; } else { ListNode * pNode = *pHead; while (pNode->m_next != NULL) { pNode = pNode->m_next; } pNode->m_next = pNew; }}
这里为什么一定要把把链表头指针定义为二维指针???
首先了解一下指针的基本概念:
C++中函数参数传递的知识点
传值引用和地址引用;
如果函数定义为:
void printValueAdd(int &a)
{
cout << (&a) << endl;
}
加&,则调用该函数的变量a为地址引用,即用的为同一个变量。
void printValueAdd(int a)
{
cout << (&a) << endl;
}
没有&符号,则为传值引用。以函数调用时候会生成一个临时变量用来保存实参的值。
知道了以上两点,步入正题:
void addListNode(ListNode pHead**, int value)
当头指针为空的情况下执行*pHead = pNew;实际是直接改变了一维指针的指向,函数执行结束后,形参消失,但是一维指针中的内容已经发生了变化。
如果采用一维指针进行插入链表代码如下:
void addListNodeForOneLevvel(ListNode * pHead, int value){ ListNode * pNew = new ListNode(); pNew->m_value = value; pNew->m_next = NULL; if (pHead == NULL) { pHead = pNew; } else { ListNode * pNode = pHead; while (pNode->m_next != NULL) { pNode = pNode->m_next; } pNode->m_next = pNew; }}
内存结构如下
当头节点为空的情况下执行*pHead = pNew;这里修改的只是形参一维指针的指向,函数执行完毕,形参消失,实参并没有改变。
学习编程最美的地方是可以通过编码来验证自己的经过思考的想法,很棒。
0 0
- C++链表插入,为什么头节点必须是二位指针
- 链表中的头指针和头节点
- 头指针,头节点
- 【c/c++】单链表、头指针、头结点、首元节点
- 头节点链表C程序
- 【C与指针】有序单链表插入节点
- 链表插入与删除操作中的头、尾指针
- c语言链表 头指针
- 头指针链表C程序
- C语言 头指针链表
- 链表指针新理解以及插入里链表节点新方法
- 头节点链表
- 头指针,头节点,首元节点
- 头指针链表数据插入方式----头插和尾插
- C语言实现无头节点链表
- 头指针链表插入数据方式之任意位置插入
- 在无头单链表的一个非头节点前插入一个节点(C语言)
- C语言:【单链表】在无头单链表的一个非头节点前插入一个节点
- ELK简单问答
- c++调用.net dll,调试时报异常First-chance exception at 0x7556C54F (KernelBase.dll)
- keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect
- 直接访问/web-inf/下的页面
- 表单修改提交后,中文乱码问题
- C++链表插入,为什么头节点必须是二位指针
- 修改Eclipse项目使之支持JPA工具
- 【Python学习笔记】pip安装失败的替代方法&解决方案
- for ... in()语句 (类似查询字段的别名),这里是结果集的别名
- QT操作WPS表格的简单实现
- JavaScript 相关知识
- 在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件
- 多维度条件情况处理
- [BZOJ 2442][Usaco2011 Open]修剪草坪:单调队列