File tree Expand file tree Collapse file tree 2 files changed +26
-4
lines changed Expand file tree Collapse file tree 2 files changed +26
-4
lines changed Original file line number Diff line number Diff line change 22
33https://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```
3545class Solution {
3646public:
@@ -50,17 +60,29 @@ public:
5060};
5161```
5262
53- ### 递归算法
63+ ## 递归法
64+
65+ 递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。
66+
67+ 关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。
68+
69+ 具体可以看代码(已经详细注释),** 双指针法写出来之后,理解如下递归写法就不难了,代码逻辑都是一样的。**
5470```
5571class Solution {
5672public:
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
You can’t perform that action at this time.
0 commit comments