链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。
1.1链表的类型
单链表:每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),单链表中的指针域只能指向节点的下一个节点。
双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。既可以向前查询也可以向后查询。
循环链表:是链表首尾相连。
1.2链表的存储方式
数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。
所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。
1.3 链表的定义
注意:
- 编程语言标准库一般都会提供泛型,即你可以指定 字段为任意类型,而力扣的单链表节点的 字段只有 int 类型。
- 编程语言标准库一般使用的都是双链表而非单链表。单链表节点只有一个 指针,指向下一个节点;而双链表节点有两个指针, 指向前一个节点, 指向下一个节点。
1.4虚拟头结点的创建
使用虚拟头结点的优点
- 简化插入和删除操作:有了虚拟头结点,无论是插入还是删除操作都无需特殊处理链表头节点。
- 统一操作逻辑:避免处理头节点和其他节点时的代码差异,使代码逻辑更加一致。
- 防止空指针异常:当链表为空或只包含一个节点时,虚拟头结点能减少空指针检查。
可以将虚拟头结点定义为一个指针并动态分配内存,或者直接在栈上创建。以下是创建虚拟头结点的几种方法:
1. 使用动态分配的虚拟头结点
动态分配一个空节点,通常将其 设为 0 或不进行初始化(取决于需求)。 指针指向实际的链表头节点。
在这种情况下, 本身不保存实际数据,仅作为占位节点。
2. 使用栈上分配的虚拟头结点
可以在栈上创建虚拟头结点,避免动态分配的内存管理。这样虚拟头结点的生命周期会随作用域结束自动释放。
总结:
- 动态分配适合长期使用、需要传递的链表,但需手动管理内存。
- 栈上分配适合局部、短期链表操作,自动管理内存、代码更简洁。
1.5 p1.next和p1->next有什么区别
和 的区别在于 的类型不同:
- 用于对象,直接访问对象的成员。
- 用于指针,通过指针访问所指向对象的成员。
- p1.next:
- 使用点号()访问成员变量,表示 是一个对象。
- 例如,如果 是 类型的对象,那么 可以访问 的成员变量 。
- p1->next:
- 使用箭头()访问成员变量,表示 是一个指针。
- 如果 是一个指向 类型的指针,那么 可以访问它所指向对象的成员变量 。
203. 移除链表元素(虚拟头结点)
给你一个链表的头节点 和一个整数 ,请你删除链表中所有满足 的节点,并返回新的头节点
示例 1:
示例 2:
示例 3:
解题代码:
完整ACM模式代码,含链表创建,链表输出打印内容:
21. 合并两个有序链表(虚拟头结点)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
示例 2:
示例 3:
86. 分隔链表(2个链表然后合并)
给你一个链表的头节点 和一个特定值 ,请你对链表进行分隔,使得所有 小于 的节点都出现在 大于或等于 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
示例 2:
23. 合并 K 个升序链表(最小堆)
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
示例 2:
示例 3:
19. 删除链表的倒数第 N 个结点(快指针先走k后,慢指针走)
给你一个链表,删除链表的倒数第 个结点,并且返回链表的头结点。
示例 1:
示例 2:
示例 3:
876. 链表的中间结点(快慢指针差2倍)
给你单链表的头结点 ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
示例 1:
示例 2:
(这道题是我第一次实习面试时候,面试官直接让我写完整实现程序,也就是ACM模式,当时一点也不熟悉,甚至在本地编辑器都不会写ListNode的创建,愣是反应半天没写出来,现在我把完整代码附在下面)
142. 环形链表 II(快慢指针差两倍)
给定一个链表的头节点 ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 是 ,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。
160. 相交链表(计算长度差后先后走)
给你两个单链表的头节点 和 ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 。
示例 1:
示例 2:
示例 3:
206. 反转链表()
给你单链表的头节点 ,请你反转链表,并返回反转后的链表。
示例 1:
示例 2:
示例 3:
到此这篇对于有头指针和尾指针的单向链表是什么(带头尾指针的单链表)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qkl-jc/42736.html