Skip to content

Commit e949a27

Browse files
反转链表
1 parent 84fe2e4 commit e949a27

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

problems/0206.翻转链表.md

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,17 @@
22

33
https://leetcode-cn.com/problems/reverse-linked-list/
44

5-
## 思路
5+
> 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。
6+
7+
# 第206题:反转链表
8+
9+
题意:反转一个单链表。
10+
11+
示例:
12+
输入: 1->2->3->4->5->NULL
13+
输出: 5->4->3->2->1->NULL
14+
15+
# 思路
616

717
如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。
818

@@ -28,9 +38,9 @@ https://leetcode-cn.com/problems/reverse-linked-list/
2838

2939
最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。
3040

31-
## C++代码
41+
# C++代码
3242

33-
### 模拟算法
43+
## 双指针法
3444
```
3545
class Solution {
3646
public:
@@ -50,17 +60,29 @@ public:
5060
};
5161
```
5262

53-
### 递归算法
63+
## 递归法
64+
65+
递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。
66+
67+
关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。
68+
69+
具体可以看代码(已经详细注释),**双指针法写出来之后,理解如下递归写法就不难了,代码逻辑都是一样的。**
5470
```
5571
class Solution {
5672
public:
5773
ListNode* reverse(ListNode* pre,ListNode* cur){
5874
if(cur == NULL) return pre;
5975
ListNode* temp = cur->next;
6076
cur->next = pre;
77+
// 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
78+
// pre = cur;
79+
// cur = temp;
6180
return reverse(cur,temp);
6281
}
6382
ListNode* reverseList(ListNode* head) {
83+
// 和双指针法初始化是一样的逻辑
84+
// ListNode* cur = head;
85+
// ListNode* pre = NULL;
6486
return reverse(NULL, head);
6587
}
6688

video/206.翻转链表.gif

1.09 MB
Loading

0 commit comments

Comments
 (0)