【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;
    }
};
相关推荐
云:鸢10 分钟前
C语言链表设计及应用
c语言·开发语言·数据结构·链表
wallflower202010 分钟前
滑动窗口算法在前端开发中的探索与应用
前端·算法
林木辛11 分钟前
LeetCode热题 42.接雨水
算法·leetcode
MicroTech202538 分钟前
微算法科技(NASDAQ: MLGO)采用量子相位估计(QPE)方法,增强量子神经网络训练
大数据·算法·量子计算
星梦清河41 分钟前
宋红康 JVM 笔记 Day15|垃圾回收相关算法
jvm·笔记·算法
货拉拉技术1 小时前
揭秘语音交互的核心技术
算法
矛取矛求1 小时前
日期类的实现
开发语言·c++·算法
在下雨5992 小时前
项目讲解1
开发语言·数据结构·c++·算法·单例模式
Jayyih2 小时前
嵌入式系统学习Day36(简单的网页制作)
学习·算法
脑洞代码2 小时前
20250909的学习笔记
算法