【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;
    }
};
相关推荐
贝塔实验室1 小时前
LDPC 码的构造方法
算法·fpga开发·硬件工程·动态规划·信息与通信·信号处理·基带工程
Greedy Alg2 小时前
LeetCode 287. 寻找重复数
算法
2501_938791222 小时前
逻辑回归与KNN在低维与高维数据上的分类性能差异研究
算法·分类·逻辑回归
南方的狮子先生2 小时前
【深度学习】60 分钟 PyTorch 极速入门:从 Tensor 到 CIFAR-10 分类
人工智能·pytorch·python·深度学习·算法·分类·1024程序员节
报错小能手2 小时前
C++笔记(面向对象)类模板
算法
JJJJ_iii2 小时前
【机器学习10】项目生命周期、偏斜类别评估、决策树
人工智能·python·深度学习·算法·决策树·机器学习
fie88893 小时前
基于MATLAB的LBFGS优化算法实现
算法·matlab
天选之女wow3 小时前
【代码随想录算法训练营——Day50(Day49周日休息)】图论——98.所有可达路径
算法·图论
刀法自然3 小时前
栈实现表达式求值
数据结构·算法·图论
我搞slam3 小时前
有效的括号--leetcode
linux·算法·leetcode