题目
链接:206. 反转链表 - 力扣(LeetCode)
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
class Solution {
public:ListNode* reverseList(ListNode* head) {}
};
思路 & 代码
双指针法
- 双指针:①cur指针指向头节点;②pre指针初始化为 NULL。
- 反转:
- 先保存 cur->next:temp = cur->next;
- 反转:pre = cur->next;
- 移动:先移动pre, pre = cur;再移动cur, cur = temp;
- 结束条件:cur == NULL
- 返回链表:return pre;
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* cur = head;ListNode* pre = nullptr;while(cur){ListNode* temp = cur->next;cur->next = pre;pre = cur;cur = temp;}return pre;}
};
递归法
递归三部曲:
- 确定递归函数的参数和返回值
- 参数:需要在递归中进行处理的
- 返回值:根据返回值来确定返回类型
- 确定终止条件
- 确定单层递归逻辑
- 确定每一层递归需要处理的信息。就是重复调用自己的过程。
class Solution {
public:ListNode* reversed(ListNode* cur, ListNode* pre){if(cur == nullptr) return pre;ListNode* temp = cur->next;cur->next = pre;return reversed(temp,cur);}ListNode* reverseList(ListNode* head) {return reversed(head, nullptr);}
};