一.移除链表原色
#203 移除链表元素(简单 链表 递归)
1.虚拟头节点
ListNode* h = new ListNode(0); // 设置⼀个虚拟头结点
h->next = head;
2.记得处理内存
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
二.设计链表(包含5个基本操作)
#707 设计链表 (获取,添加(首,尾,普通),删除) × 重要
1.链表节点定义
// 单链表
struct ListNode {
int val; // 节点上存储的元素
ListNode next; // 指向下⼀个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数
};
通过⾃⼰定义构造函数初始化节点:ListNode head = new ListNode(5);
使⽤默认构造函数初始化节点:ListNode* head = new ListNode();head->val = 5;
2.删除节点
c++最好手动释放删除节点的内存
3.
三.反转链表
#203 反转链表(简单递归 链表)
1.双指针法 前指针pre 后指针next
2.递归法
3.虚拟头节点法
4.栈
四.两两交换
#24两两交换链表中的节点(中等 递归 链表)
1.思路 注意(cur=h;//即cur一开始是虚拟头节点)
五.删除链表的倒数第N个节点
#19 删除链表的倒数第N个结点(中等 链表 双指针)√
1.自己的做法:先走到链表最后一个节点 统计链表节点数num 然后将倒数第n个 转化为正数第num-n+1
2.双指针法:
fast⾸先⾛n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上⼀个节点(⽅便做删除操作),如图:
fast和slow同时移动,直到fast指向末尾,如图:
删除slow指向的下⼀个节点,如
六.链表相交
#面试题 02.07. 链表相交 ×
1.简单来说,就是求两个链表交点节点的指针。 这⾥同学们要注意,交点不是数值相等,⽽是指针相等。
七.环形链表
#142环形链表 II(中等)×
1.解题动画https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html#%E6%80%9D%E8%B7%AF
2.思路:(1)先判断是否有环 fast=fast->next->next;slow=slow->next;//fast一次走两步 slow一次走一步 如果有环必定相遇
(2)有环找环的起点:一个指针从相遇点开始 另一个指针从链表头节点开始 两个每次走一步 相遇处即环的起点
#附录
- 学习内容大多来源于https://programmercarl.com/(代码随想录)
- #111 代表力扣题库题号111