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)
相关推荐
点云侠28 分钟前
PCL 生成三棱锥点云
c++·算法·最小二乘法
兰令水39 分钟前
leecodecode【面试150】【2026.6.13打卡-java版本】
java·算法·leetcode
临沂堇44 分钟前
刷题日志 | Leetcode Hot 100 哈希
算法·leetcode·哈希算法
.道阻且长.1 小时前
C++ string 操作指南:接口解析
java·c语言·开发语言·c++
laplaya1 小时前
使用 vcpkg 管理 C++ 项目中的依赖
开发语言·c++
blueman88883 小时前
VS2022 切换定义(F12 / Go to Definition)反应慢
c++·visual studio
凡人叶枫3 小时前
Effective C++ 条款35:考虑 virtual 函数以外的其他选择
java·c++·spring
郝学胜-神的一滴3 小时前
CMake 017:彩色日志输出实战
linux·c语言·开发语言·c++·软件工程·软件构建·cmake
Navigator_Z3 小时前
LeetCode //C - 1096. Brace Expansion II
c语言·算法·leetcode
桀人3 小时前
C++——string类的详细介绍
开发语言·c++