LeetCode206 反转链表

前言

题目: 206. 反转链表
文档: 代码随想录------反转链表
编程语言: C++
解题状态: 有了思路以后没敢尝试

思路

需要注意的是创建指针不会申请额外的内存空间。

代码

方法一: 双指针法/迭代

我的理解是创建了三个指针,前中后各一个,进行滑动。先把 n e x t next next节点保存在后面的指针中,再把当前节点的 n e x t next next指针指向前面一个节点,然后一起平移这三个指针。

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* tmp;
        ListNode* cur = head;
        ListNode* pre = nullptr;

        while (cur) {
            tmp = cur -> next;
            cur -> next = pre;
            pre = cur;
            cur = tmp;
        }

        return pre;
    }
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

方法二: 递归

有点抽象,不是特别理解递归代表的具体含义,应该是封装了平移指针的操作。

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* reverse(ListNode* pre, ListNode* cur) {
        if (cur == nullptr) return pre;

        ListNode* tmp = cur -> next;
        cur -> next = pre;

        return reverse(cur, tmp);
    }

    ListNode* reverseList(ListNode* head) {
        return reverse(nullptr, head);
    }
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n),空间复杂度主要取决于递归调用的栈空间,最多为 n 层。
相关推荐
可编程芯片开发8 分钟前
基于PI控制算法的pwm直流电机控制系统Simulink建模与仿真
算法
小王C语言10 分钟前
【8.进行接口测试】:通过 curl 进行接口自动化测试 / 通过 python 程序进行接口自动化测试
网络·c++
怕浪猫27 分钟前
2840亿参数只卖白菜价:DeepSeek V4 Flash 正式版上线,Agent 能力暴涨6倍
人工智能·算法
让学习成为一种生活方式32 分钟前
苄基异喹啉生物碱糖基转移酶UGT74AN1晶体--Journal of Agricultural and Food Chemistry
人工智能·算法
alphaTao36 分钟前
LeetCode 每日一题 2026/7/27-2026/8/2
python·算法·leetcode
三克的油1 小时前
数据结构-4
数据结构
888CC++1 小时前
C++ 快速学习指南:从入门到进阶的实战路线
开发语言·c++
2501_926978331 小时前
提示工程的实战报告(二):模型的失败模式与边界行为
人工智能·深度学习·算法
小小晓.1 小时前
C++记:函数
开发语言·c++·算法
casual~1 小时前
模逆元计算方法详解:扩展欧几里得算法与费马小定理
学习·算法·逆元