leetcode之hot100---206反转链表(C++)

思路一:迭代

遍历链表,逐步反转每个节点的指针方向

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) {
        if(head == nullptr){
            return nullptr;
        }
        ListNode* front = nullptr;//用于保存反转链表过程中的前驱节点,初始为空
        ListNode* current = head;//用于保存当前节点,初始为头节点
        //遍历链表
        while(current != nullptr){
            // 保存当前节点的下一个节点,防止丢失链表后续部分
            ListNode* next = current->next;
            //反转链表,使当前节点的后继为之前的前驱
            current->next = front;
            //更新前驱
            front = current;
            //更新当前节点
            current = next;
        }
        //返回反转链表的头结点
        return front;
        
    }
};
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

思路二:递归

不断递归调用该函数,使当前节点的后继的后继为当前节点

例如:1 - > 2 - > 3 - > 4

当 当前节点为 1 时,我们需要先反转链表的一部分1 - > 2

此时需要将 2 的后继修改为1 ,对应代码head->next->next = head;

同时需要将1 - > 2 之间断开,对应代码head->next = nullptr;

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) {
        if(head == nullptr){
            return nullptr;
        }
        if(head->next == nullptr){
            return head;
        }
        ListNode* newHead = reverseList(head->next);
        head->next->next = head;//使当前节点的后继的后继为当前节点
        head->next = nullptr;//断链
        //返回反转链表的头结点
        return newHead;
        
    }
};
  • 时间复杂度:O(N)
  • 空间复杂度:O(N)
相关推荐
qeen8728 分钟前
【数据结构】单链表及双向链表的解析与实现
数据结构·链表
无限进步_44 分钟前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio
C+-C资深大佬1 小时前
C++ 数据类型转换是如何实现的?
开发语言·c++·算法
oioihoii2 小时前
回归测试:软件演进中的质量守护神与实践全指南
c++
菜鸟233号3 小时前
力扣213 打家劫舍II java实现
java·数据结构·算法·leetcode
十五年专注C++开发3 小时前
CMake基础: 在release模式下生成调试信息的方法
linux·c++·windows·cmake·跨平台构建
狐573 小时前
2026-01-18-LeetCode刷题笔记-1895-最大的幻方
笔记·算法·leetcode
点云SLAM3 小时前
C++(C++17/20)最佳工厂写法和SLAM应用综合示例
开发语言·c++·设计模式·c++实战·注册工厂模式·c++大工程系统
Q741_1473 小时前
C++ 队列 宽度优先搜索 BFS 力扣 662. 二叉树最大宽度 每日一题
c++·算法·leetcode·bfs·宽度优先
csdn_aspnet3 小时前
C++跨平台开发:工程难题与解决方案深度解析
c++