链表的核心概念
链表是一种线性数据结构,其内部的物理存储单元非连续,非顺序,而是通过节点中的指针将所有元素串联而成
单链表的每个节点通常包含两部分:存储数据的变量和指向下一个节点的指针
节点结构体定义
1 | struct ListNode { |
链表的基本操作(创建、遍历、摧毁)
1 | // 遍历并打印链表 |
1 | // 摧毁链表,释放内存 |
1 | int main(){ |
链表的题解分析
处理链表问题的常用技巧:虚拟头结点、双指针和节点指针的断开与重写
翻转链表
题目描述:
翻转一个单链表,例如输入1->2->3->nullptr,输出3->2->1->nullptr
算法思路:
引入三个指针:pre(指向当前节点的前驱)、cur(指向当前节点)、temp(暂存当前节点的后继,防止断开连接后丢失)。在遍历过程中,将cur->next指向pre,然后整体向后移动。
1 | class Solution{ |
删除链表的倒数第N个节点
题目描述:
给你一个链表,删除链表的倒数第n个节点,并且返回链表的头结点
算法思路
-
虚拟头结点:在原链表头节点前添加一个辅助节点,用于统一处理删除头结点的边界情况
-
快慢双指针:
- 让
fast指针先向前移动n+1步 - 随后,
fast和slow指针同步向前移动,直到fast到达nullptr - 此时,
slow指针恰好指向待删除节点的前驱节点,执行slow->next=slow->next->next即可
- 让
1 | class Solution { |
说些什么吧!