反转链表

This commit is contained in:
youngyangyang04
2020-08-16 07:49:51 +08:00
parent 09b41a0c07
commit 4a9af842e3
2 changed files with 26 additions and 4 deletions

View File

@ -2,7 +2,17 @@
https://leetcode-cn.com/problems/reverse-linked-list/ 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指针就指向了新的头结点。 最后cur 指针已经指向了null循环结束链表也反转完毕了。 此时我们return pre指针就可以了pre指针就指向了新的头结点。
## C++代码 # C++代码
### 模拟算 ## 双指针
``` ```
class Solution { class Solution {
public: public:
@ -50,7 +60,13 @@ public:
}; };
``` ```
### 递归 ## 递归法
递归法相对抽象一些但是其实和双指针法是一样的逻辑同样是当cur为空的时候循环结束不断将cur指向pre的过程。
关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = headpre = NULL在递归法中可以从如下代码看出初始化的逻辑也是一样的只不过写法变了。
具体可以看代码(已经详细注释),**双指针法写出来之后,理解如下递归写法就不难了,代码逻辑都是一样的。**
``` ```
class Solution { class Solution {
public: public:
@ -58,9 +74,15 @@ public:
if(cur == NULL) return pre; if(cur == NULL) return pre;
ListNode* temp = cur->next; ListNode* temp = cur->next;
cur->next = pre; cur->next = pre;
// 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
// pre = cur;
// cur = temp;
return reverse(cur,temp); return reverse(cur,temp);
} }
ListNode* reverseList(ListNode* head) { ListNode* reverseList(ListNode* head) {
// 和双指针法初始化是一样的逻辑
// ListNode* cur = head;
// ListNode* pre = NULL;
return reverse(NULL, head); return reverse(NULL, head);
} }

BIN
video/206.翻转链表.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB