mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
反转链表
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user