算法训练营day03 | {203. 移除链表元素, 707.设计链表, 206.反转链表}
第二章链表-part01,知识点为虚拟头结点、双指针原地反转链表、递归写法。
203. 移除链表元素
- 题目链接:203.移除链表元素
- 文档讲解:代码随想录–203移除链表元素
- 视频讲解:手把手带你学会操作链表 | LeetCode:203.移除链表元素
- 状态:简单的单链表删除
1.1 看到题目的想法
加上虚拟的头结点,统一任意位置结点的删除操作,比较简单,实现如下:
▶
AC解法1 | |
1.2 看完代码随想录的想法
- 设置虚拟头结点的写法,变量定义取名
cur和dummy感觉挺好的。
707. 设计链表
- 题目链接:707.设计链表
- 文档讲解:代码随想录–707.设计链表
- 视频讲解:帮你把链表操作学个通透!LeetCode:707.设计链表
- 状态:写了一种单链表的MyLinkedList,挺简单。
2.1 解题过程
注意第一次提交尾插法方法没有考虑到链表本身为空时,会有空指针异常。代码如下:
▶
AC解法1 | |
206. 反转链表
- 题目链接:206.反转链表
- 文档讲解:代码随想录–206.反转链表
- 视频讲解:帮你拿下反转链表 | LeetCode:206.反转链表 | 双指针法 | 递归法
- 状态:开了新的连表头,头插法解出来的。
3.1 看完视频讲解的想法
- 双指针法,原地反转的做法真妙啊,值得学习。
- 对照双指针方法写出递归解法。动画如下:

两个版本的代码如下:▶AC解法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37package cn.leetcode.list;
public class ReverseList {
/**
* 双指针写法,原地反转
* @param head
* @return
*/
public ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode pre = null;
while(cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
/**
* 递归写法主函数
* @param head
* @return
*/
public ListNode reverseListV2(ListNode head) {
return reverse(head, null);
}
public ListNode reverse(ListNode cur, ListNode pre) {
if(cur == null) return pre;
ListNode temp = cur.next;
cur.next = pre;
return reverse(temp, cur);
}
}
算法训练营day03 | {203. 移除链表元素, 707.设计链表, 206.反转链表}
http://paopaotangzu.xyz/cn/day03_leetcode/