【LeetCode热题100】206. 反转链表(链表)

一.题目要求

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

二.题目难度

简单

三.输入样例

示例 1:

输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]

输出:[2,1]

示例 3:

输入:head = []

输出:[]

提示:

链表中节点的数目范围是 [0, 5000]

-5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

四.解题思路

解法1:尾插法

解法2:递归

五.代码实现

迭代

cpp 复制代码
/**
 * 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) {
        ListNode *p = head;
        ListNode *q = head;
        ListNode *r = q;
        if(head == NULL) return NULL;
        while(p->next != NULL) p = p->next;
        ListNode *back = p;
        while(r != back)
        {
            r = q->next;
            q->next = p->next;
            p->next = q;
            q = r;
        }

        return back;
    }
};

递归(看的评论)

cpp 复制代码
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 链表为空时直接返回,链表不为空则到返回最后一个节点
        if(!head || !head->next) {
            return head;
        }
        // newHead先指向最后一个节点,注意此时参数是倒数第二个节点
        // 这一步很精妙,每一次newHead都是指向空指针(链表为空)或保留在原链表中的最后一个节点(链表不空),作用就是返回新的头结点
        ListNode* newHead = reverseList(head->next);
        // 最后一个节点指向倒数第二个节点
        head->next->next = head;
        // 倒数第二个节点的下一节点置空。此时倒数第三个节点仍指向倒数第二个节点,下一次递归中将倒数第二个节点下一节点指向倒数第三个节点,不断重复这一过程
        head->next = nullptr;
        return newHead;
    }
};

六.题目总结

cpp 复制代码
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    	//给我一个结点
    	//我要将该结点后面的结点反过来指向该结点
    	//我要给下个人处理完该处理的下一个结点
    	//当处理完之后就可以返回了
        if(!head || !head->next) {
            return head;
        }
        ListNode* newHead = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return newHead;
    }
};
相关推荐
董董灿是个攻城狮5 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员12 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish12 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱13 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript