目录
206. 反转链表
https://leetcode.cn/problems/reverse-linked-list/


头插法
我们看到, 链表中的节点数目范围是 0~5000, 所以我们的代码中要处理一下边界情况.
思路: 我们需要遍历一遍链表, 没遍历到一个节点, 我们就将这个节点拿下来尾插到一个新的空的链表上.
我们考虑一下边界情况, 如果说这个链表本身就是空的, 另一种情况, 这个链表只有一个节点, 我们就不需要反转了, 可以直接返回.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode *rList = new ListNode(0);
ListNode *cur = head;
while (cur)
{
ListNode *next = cur->next;
cur->next = rList->next;
rList->next = cur;
cur = next;
}
cur = rList->next;
delete rList;
return cur;
}
};
递归法
递归方法呢? 我们要找到最小子问题, 可以将链表想象成只有两个节点, 一个节点是头节点(当前节点), 指向下一个节点, 另一个是除了头节点以外剩下所有节点的总和, 指向nullptr. 我们只需要要让这代表这一串节点总和的节点去执行头节点, 让头节点指向空, 就完成了翻转. 有兴趣递归展开图大家可以画一下.
边界情况依然是只有一个节点或者空链表的情况.
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode *rList = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return rList;
}
};


3559



被折叠的 条评论
为什么被折叠?



