diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index 1bd3bc41..8fc9d9cd 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -2,7 +2,17 @@ https://leetcode-cn.com/problems/reverse-linked-list/ -## 思路 +> 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 + +# 第206题:反转链表 + +题意:反转一个单链表。 + +示例: +输入: 1->2->3->4->5->NULL +输出: 5->4->3->2->1->NULL + +# 思路 如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。 @@ -28,9 +38,9 @@ https://leetcode-cn.com/problems/reverse-linked-list/ 最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。 -## C++代码 +# C++代码 -### 模拟算法 +## 双指针法 ``` class Solution { public: @@ -50,7 +60,13 @@ public: }; ``` -### 递归算法 +## 递归法 + +递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。 + +关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。 + +具体可以看代码(已经详细注释),**双指针法写出来之后,理解如下递归写法就不难了,代码逻辑都是一样的。** ``` class Solution { public: @@ -58,9 +74,15 @@ public: if(cur == NULL) return pre; ListNode* temp = cur->next; cur->next = pre; + // 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步 + // pre = cur; + // cur = temp; return reverse(cur,temp); } ListNode* reverseList(ListNode* head) { + // 和双指针法初始化是一样的逻辑 + // ListNode* cur = head; + // ListNode* pre = NULL; return reverse(NULL, head); } diff --git a/video/206.翻转链表.gif b/video/206.翻转链表.gif new file mode 100644 index 00000000..ad2fdafd Binary files /dev/null and b/video/206.翻转链表.gif differ