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)
相关推荐
C++ 老炮儿的技术栈6 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl6 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
Liu628886 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
参.商.7 小时前
【Day41】143. 重排链表
leetcode·golang
波特率1152007 小时前
const关键字与函数的重载
开发语言·c++·函数重载
干啥啥不行,秃头第一名7 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
2301_807367198 小时前
C++中的解释器模式变体
开发语言·c++·算法
2301_819414309 小时前
C++与区块链智能合约
开发语言·c++·算法
Zaly.10 小时前
【Python刷题】LeetCode 1727 重新排列后的最大子矩阵
算法·leetcode·矩阵
不想看见40410 小时前
Valid Parentheses栈和队列--力扣101算法题解笔记
开发语言·数据结构·c++