【头结点】【头指针】【首元结点】

article/2025/11/9 2:38:53

2022 -1-14

文章目录

  • 2022 -1-14
  • 1. 定义:
  • 2. 哨兵(头结点)
  • 3. 有无头结点的单链表的创建
    • 3.1 有头结点
      • 3.1.1 头插法:
      • 3.1.2 尾插法:
    • 3.2 无头结点
      • 3.2.1 头插法:
      • 3.2.2 尾插法:

1. 定义:

头结点(不一定有),存在为了方便操作,头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度),对在第一元素结点前插入结点和删除第一结点起操作与其它结点的操作就统一了。

首元结点:实际记录数据的第一个节点;

头指针:指向第一个物理节点地址的指针,就是定义的链表名,这个头指针的意义在于,在访问链表时,总要知道链表存储在什么位置(从何处开始访问),由于链表的特性(next指针),知道了头指针,那么整个链表的元素都能够被访问,也就是说头指针是必须存在的。

在这里插入图片描述
2021-10-31【数据结构练习题】【删除结点*s的直接前驱】

2. 哨兵(头结点)

如果我们在结点 p 后面插入一个新的结点,只需要下面两行代码就可以搞定。

new_node->next = p->next;
p->next = new_node;

当我们要向一个空链表中插入第一个结点,刚刚的逻辑就不能用了。我们需要进行下面这样的特殊处理,其中 head 表示链表的头结点。所以,从这段代码,我们可以发现,对于单链表的插入操作,第一个结点和其他结点的插入逻辑是不一样的。

if (head == null) {head = new_node;
}

单链表结点删除操作。如果要删除结点 p 的后继结点,我们只需要一行代码就可以搞定。

p->next = p->next->next;

如果我们要删除链表中的最后一个结点,前面的删除代码就不工作了。跟插入类似,我们也需要对于这种情况特殊处理。写成代码是这样子的:

if (head->next == null) {head = null;
}

针对链表的插入、删除操作,需要对插入第一个结点和删除最后一个结点的情况进行特殊处理,这样代码实现起来就会很繁琐,不简洁,哨兵就是解决“边界问题”的,不直接参与业务逻辑。

空链表:head=null 表示链表中没有结点了。其中 head 表示头结点指针,指向链表中的第一个结点。

引入哨兵结点,在任何时候,不管链表是不是空,head 指针都会一直指向这个哨兵结点。我们也把这种有哨兵结点的链表叫带头链表。相反,没有哨兵结点的链表就叫作不带头链表。

哨兵结点是不存储数据的。因为哨兵结点一直存在,所以插入第一个结点和插入其他结点,删除最后一个结点和删除其他结点,都可以统一为相同的代码实现逻辑了。

3. 有无头结点的单链表的创建

3.1 有头结点

3.1.1 头插法:

typedef struct ListNode{int val;ListNode *next;
}ListNode,*Listline;
// 头插法
ListNode* CreateList(int length){if (length < 1)return NULL;ListNode *head = (ListNode*)malloc(length*sizeof(ListNode));head -> next = NULL;int k = 1;ListNode *s = NULL;while (k <= length){s = (ListNode*)malloc(sizeof(ListNode));s -> next = head -> next;head -> next = s;k++;}return head;
}

3.1.2 尾插法:

typedef struct ListNode{int val;ListNode *next;
}ListNode,*Listline;
// 尾差法
ListNode* CreateList(int length){if (length < 1)return NULL;ListNode *head = (ListNode*)malloc(length*sizeof(ListNode));ListNode *s = head;int k = 1;ListNode *r = NULL;while (k <= length){r = (ListNode*)malloc(sizeof(ListNode));s -> next = r;s = r;k++;}s -> next = NULL;return head;
}

3.2 无头结点

3.2.1 头插法:

typedef struct ListNode{int val;ListNode *next;
}ListNode,*Listline;// 头插法
ListNode* CreateList(int length){if (length < 1)return NULL;ListNode *head = (ListNode*)malloc(sizeof(ListNode));head -> next = NULL;ListNode *s = NULL;int k = 1;while (k <= length - 1){s = (ListNode*)malloc(sizeof(ListNode));s -> next = head;head = s;k++}return head;
}

3.2.2 尾插法:

typedef struct ListNode{int val;ListNode *next;
}ListNode,*Listline;// 尾插法
ListNode* CreateList(int length){if (length < 1)return NULL;ListNode *head = (ListNode*)malloc(sizeof(ListNode)); ListNode *s = head, *r = NULL;int k = 1;while (k <= length - 1){r = (ListNode*)malloc(sizeof(ListNode));s -> next = r;s = r;k++}s -> next = NULL;return head;
}

http://chatgpt.dhexx.cn/article/HA3CpD0G.shtml

相关文章

python 链表中头结点的含义以及引入头结点的作用

一、概念 头结点:是虚拟出来的一个结点&#xff0c;不保存数据。头结点的next指针指向链表中的第一个节点。对于头结点&#xff0c;数据域可以不存储任何信息&#xff0c;也可存储如链表长度等附加信息。头结点不是链表所必需的。 头指针:是指向第一个结点的指针,如果链表没有…

数据结构:头指针,头结点详解(新手.小白)

如果不想看定义的话&#xff0c;可以看我的第二部分&#xff0c;里面有我自己遇到的一些疑难。 下文中出现的有关于java的&#xff0c;也有c语言的指针&#xff08;可以看成java的引用变量&#xff09;&#xff0c;觉得写得不好&#xff0c;多多包涵 目录 (一&#xff09;…

头结点的含义以及引入头结点的作用

一、概念 头结点:是虚拟出来的一个节点&#xff0c;不保存数据。头结点的next指针指向链表中的第一个节点。对于头结点&#xff0c;数据域可以不存储任何信息&#xff0c;也可存储如链表长度等附加信息。头结点不是链表所必需的。 头指针:是指向第一个结点的指针,如果链表没有…

qpython 3h下载_【分享】QPython 3H3.0.0 一个伟大的脚本编辑器!

这有点。。。东西!!! 【应用名称】&#xff1a;QPython 3H 【应用版本】&#xff1a;3.0.0 【应用大小】&#xff1a;25.41M 【软件介绍】&#xff1a; 这个软件集成了Python3解释器、Console控制台、QEdit编辑器和SL4A库&#xff0c;可以直接在安卓手机上运行Python代码&…

qpython3l_qpython3例子

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 在控制台使用计划界面创建使用计划&#xff0c;并将使用计划与已创建的密钥对绑定&#xff08;参考 使用计…

qpython 3h_QPython 3H

qpython 3h一款用于线上编辑来提供的手机软件&#xff0c;能够让你轻松的进行法语内容的快速编辑&#xff0c;用户只需要通过输入之后即可轻松的在软件生成法语&#xff0c;还能够轻松的将文字转化成相对应的法语让你在翻译的时候享受便捷效果&#xff0c;更是还拥有着独特的解…

说一说Qpython3在Android手机上的应用

QPython3是一款可以完美运行于Android平台上的Python3的脚本引擎&#xff0c;QPython3整合了Python3解释器、Console、编辑器和SL4A库。让你在Android设备上也能方便的开发Python项目。 研究Qpython也有一段时间了&#xff0c;一直想记录一些东西以便后面可以回顾&#xff0c;…

Visio使用技巧备忘录

用Visio画图过程中&#xff0c;将遇到的问题记录下来&#xff0c;以免忘记。 内容如下&#xff1a; 1、画流程图时&#xff0c;新建&#xff0c;根据需求选里面的模板。&#xff08;第一次选的空白绘图&#xff0c;啥都没有&#xff09; 2、画箭头&#xff0c;点击指针工具旁边…

Visio使用技巧之默认字体大小更改

然而这东西不能保存&#xff0c;但是也算是全局设置&#xff0c;免了一步一步设置的烦恼

visio 使用技巧汇总

1.visio中图形旋转任意角度的方法 视图----任务窗格----大小与位置----角度 2.箭头形状 更多形状---流程图----箭头形状 3.汇制虚线框 从基本形状中拖出一个矩形,右击矩形,选择设置形状格式,填充选择无填充,开始菜单栏中的形状样式选择线条---虚线即可 4.云状图 (1)开始---…

【visio使用技巧】图片导出pdf时去掉多余空白

问题 在visio导出pdf格式的图片时&#xff0c;往往会存在多余的白边&#xff0c;如下图所示&#xff1a; 解决方法 依次点击&#xff1a;菜单栏→文件→选项→自定义功能区→勾选“开发工具”→确定。 依次点击菜单栏→开发工具→显示ShapeSheet→页→Print Properties→将…

软件开发过程中的Visio使用

文章目录 前言一、思维导图二、用例图三、跨系统流程图四、流程图五、时序图六、其他图形 前言 在软件需求分析和设计过程中&#xff0c;时常需要通过图形来梳理和表达软件的运行原理。visio是一款专业的办公绘图软件&#xff0c;具有简单、便捷等关键特性。它能够帮助我们将自…

visio使用小技巧

文章目录 1.取消首字母自动大写2.跨线设置3.粘附和取消粘附4.对齐5.调整画布大小6.连接线任意位置弯折 总结 1.取消首字母自动大写 文件 -> 选项 -> 校对 -> 自动更正选项 -> 自动更正 -> 句首字母大写 2.跨线设置 选中连接线 设计 -> 连接线 -> 显示…

VISIO使用技巧汇总

0.连接线拐弯或者连接不合适 0-0.Goal ​​​​​​​ 0-1. Automatic connection 0-3.Resolvent 0-3-0.ALTF9选项&#xff0c;取消粘附位置调整 0-3-1.选中线段-选中中心点-shift增加直角调整合适位置

2-visio使用与卸载

目录 部分功能介绍图形拆分去除白边Visio绘制立方体&#xff0c;平行四边形方法不规则图形的绘制,与颜色填充visio导出PDF图&#xff0c;解决字母间距问题、线条变粗问题 卸载方法 部分功能介绍 图形拆分 目标&#xff1a;利用vision绘制一个分裂的圆。 方法&#xff1a;先画…

Visio使用教程

首先&#xff0c;根据自己需求选择自己需要的结构图&#xff0c;也可以新建白图通过图形自己设计 接着新建基本框图 图形生成&#xff0c;在模具形状里找到自己所需要的形状&#xff0c;点击左键不松&#xff0c;拖到绘图区域&#xff0c;松开左键即会形成一个自己所需要的形状…

visio使用记录

绘制双箭头 1、首先在电脑上打开microsoft visio 2013软件&#xff0c;选择任意模板进入绘图区域&#xff0c;如下图所示。 2、在上方开始菜单里找到【指针工具】选项&#xff0c;点击右侧倒三角按钮&#xff0c;弹出下拉菜单&#xff0c;在下拉菜单里找到【线条】选项&…

Visio使用

visio使用 1. 加公式2. 关于画图3. 关于流程图 1. 加公式 这个软件不知道怎么放公式&#xff0c;其实我那个也不算公式&#xff0c;主要有上下标&#xff0c;这里记录一下在哪改 结果 2. 关于画图 由于经常要把很多个图拼起来画&#xff0c;所以会先在PPT里面把图扣好&…

Visio使用技巧

线条不直&#xff1a;按住shift键移动线条端点小距离移动图形&#xff1a;按住shift键使用方向键移动图形连接线修改拐点位置&#xff1a;按住ctrl键移动线条中的点自制箭头&#xff1a;利用箭头和矩形拼成自己想要的形状&#xff0c;然后联合形状&#xff08;在视图后面的小灯…