206. 反转链表

news/2025/2/23 5:43:26

总结

方法:

  1. 迭代
  2. 递归

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表

示例1:

img
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例2:

img

输入:head = [1,2]
输出:[2,1]

示例3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

方法一:迭代

思路与算法

在遍历链表时,将当前节点的 next 指针改为指向前一个节点。

由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

/**
 * 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* prev = nullptr;
        ListNode* curr = head;
        while(curr){
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
};
复杂度分析
  • 时间复杂度: O ( n ) O(n) O(n),其中 n 是链表的长度。需要遍历链表一次。
  • 空间复杂度: O ( 1 ) O(1) O(1)

方法二:递归

思路与算法
/**
 * 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 == null || head.next == null){
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
};
复杂度分析
  • 时间复杂度: O ( n ) O(n) O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。
  • 空间复杂度: O ( n ) O(n) O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。

http://www.niftyadmin.cn/n/191379.html

相关文章

链表算法题的四类问题:基础、双指针、快慢指针、递归

一、基础 熟悉链表的数据结构 public class ListNode {public int val;public ListNode next;public ListNode(int val) { this.val val; } }1. 删除链表中指定值的节点 题目简述&#xff1a;给定一个不含重复值的单链表和一个要删除的值&#xff0c;定义一个函数删除该值节点…

(七)手把手带你搭建精美简洁的个人时间管理网站—实现登录与注册的前端代码【源码】

&#x1f31f;所属专栏&#xff1a;献给榕榕 &#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚 &#x1f62e;前言&#xff1a;该专栏系为女友准备的&#xff0c;里面会不定时发一些讨好她的技术作品&#xff0c;感兴趣的小伙伴可以关注一下~&#x1f449;文章简…

SQL基础培训07-笛卡尔积

知识点: 1、笛卡尔介绍 笛卡尔,近代法国著名哲学家、物理学家、数学家、神学家。 主要成就概述 笛卡尔在科学上的贡献是多方面的。笛卡尔不仅在哲学领域里开辟了一条新的道路,同时笛卡尔又是一勇于探索的科学家,在物理学、生理学等领域都有值得称道的创见,特别是在数学上…

我能“C”——初阶指针(下)

目录 4.指针运算 4.1 指针-整数 4.2 指针-指针 4.3 指针的关系运算 5.指针和数组 6.二级指针 7.指针数组 THE END 4.指针运算 指针-整数指针-指针指针的关系运算 4.1 指针-整数 代码里*vp&#xff08;解引用&#xff09; 是每1就跳过一个float。 4.2 指针-指针 …

Nginx:配置详解(一)

nginx的作用 反向代理&#xff1a;Nginx可以作为反向代理服务器&#xff0c;接收客户端请求&#xff0c;并将请求转发到不同的后端服务器上。负载均衡&#xff1a;Nginx支持多种负载均衡算法&#xff0c;并能够将请求分配到不同的后端服务器上&#xff0c;以提高应用程序的性能…

C++ Primer第五版_第六章习题答案(31~40)

文章目录练习6.31练习6.32练习6.33练习6.34练习6.35练习6.36练习6.37练习6.38练习6.39练习6.40练习6.31 什么情况下返回的引用无效&#xff1f;什么情况下返回常量的引用无效&#xff1f; 当返回的引用的对象是局部变量时&#xff0c;返回的引用无效&#xff1b;当我们希望返回…

eclipse上的Java静态分析工具——待续

目录 1. findugs a) 安装findbugs插件 b) 打开bug窗口 c) 使用findbugs进行静态分析 d) 查看错误信息 相比动态测试而言。静态分析效率高&#xff0c;成本较低&#xff0c;对于提高产品质量非常重要。 下面介绍几个elcipse上的静态分析插件 1. findugs a) 安装findbugs插…

锁 一、锁的分类 1.1 可重入锁、不可重入锁 Java中提供的synchronized&#xff0c;ReentrantLock&#xff0c;ReentrantReadWriteLock都是可重入锁。 重入&#xff1a;当前线程获取到A锁&#xff0c;在获取之后尝试再次获取A锁是可以直接拿到的。 不可重入&#xff1a;当前…