代码随想录--链表--反转链表

news2024/7/31 4:38:15

题目

题意:反转一个单链表。

示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

思路

如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。

其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示:
在这里插入图片描述之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。

那么接下来看一看是如何反转的呢?

我们拿有示例中的链表来举例,如动画所示:(纠正:动画应该是先移动pre,在移动cur)
在这里插入图片描述首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。

然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。

为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。

接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。

最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。

双指针法

class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp; // 保存cur的下一个节点
ListNode* cur = head;
ListNode* pre = NULL;
while(cur) {
temp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->next
cur->next = pre; // 翻转操作
// 更新pre 和 cur指针
pre = cur;
cur = temp;
}
return pre;
}
};
时间复杂度: O(n)
空间复杂度: O(1)

递归法

递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。

关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。

具体可以看代码(已经详细注释),双指针法写出来之后,理解如下递归写法就不难了,代码逻辑都是一样的。
class Solution {
public:
ListNode* reverse(ListNode* pre,ListNode* cur){
if(cur == NULL) return pre;
ListNode* temp = cur->next;
cur->next = pre;
// 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
// pre = cur;
// cur = temp;
return reverse(cur,temp);
}
ListNode* reverseList(ListNode* head) {
// 和双指针法初始化是一样的逻辑
// ListNode* cur = head;
// ListNode* pre = NULL;
return reverse(NULL, head);
}

};

时间复杂度: O(n), 要递归处理链表的每个节点
空间复杂度: O(n), 递归调用了 n 层栈空间

我们可以发现,上面的递归写法和双指针法实质上都是从前往后翻转指针指向,其实还有另外一种与双指针法不同思路的递归写法:从后往前翻转指针指向。

具体代码如下(带详细注释):
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// 边缘条件判断
if(head == NULL) return NULL;
if (head->next == NULL) return head;

    // 递归调用,翻转第二个节点开始往后的链表
    ListNode *last = reverseList(head->next);
    // 翻转头节点与第二个节点的指向
    head->next->next = head;
    // 此时的 head 节点为尾节点,next 需要指向 NULL
    head->next = NULL;
    return last;
}

};

时间复杂度: O(n)
空间复杂度: O(n)

Java

// 双指针
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode cur = head;
ListNode temp = null;
while (cur != null) {
temp = cur.next;// 保存下一个节点
cur.next = prev;
prev = cur;
cur = temp;
}
return prev;
}
}

// 递归
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(null, head);
}

private ListNode reverse(ListNode prev, ListNode cur) {
    if (cur == null) {
        return prev;
    }
    ListNode temp = null;
    temp = cur.next;// 先保存下一个节点
    cur.next = prev;// 反转
    // 更新prev、cur位置
    // prev = cur;
    // cur = temp;
    return reverse(cur, temp);
}

}

// 从后向前递归
class Solution {
ListNode reverseList(ListNode head) {
// 边缘条件判断
if(head == null) return null;
if (head.next == null) return head;

    // 递归调用,翻转第二个节点开始往后的链表
    ListNode last = reverseList(head.next);
    // 翻转头节点与第二个节点的指向
    head.next.next = head;
    // 此时的 head 节点为尾节点,next 需要指向 NULL
    head.next = null;
    return last;
} 

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java项目:基于ssm框架实现的家政服务网站管理系统分前后台(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的家政服务网站管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 二、技术实现 jdk版本:1.…

Qt+C++串口调试工具

程序示例精选 QtC串口调试工具 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《QtC串口调试工具》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。 …

JWT生成token工具类实现

JWT简介 JWT定义 JWT全称为Json web token,也就是 Json 格式的 web token JWT数据结构 1.JWT由三段字符串组成,中间用.分隔 Project_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzE2MzcwMTM0LCJpYXQiOjE3MTU3NjUzMzQsImp0aSI6IjllO…

关于DOCKER启动后如何添加新的端口映射

前段时间在用docker部署服务的时候发现,容器已经启动,但是需要新的端口映射(即容器在启动的时候只进行了部分的端口映射),经过查询资料后发现现在网上有2种方法,一中是修改json文件。另一种是将已经运行的容…

QT:QML中读取文件(QDesktopServices和QFile)

目录 一.介绍 二.QDesktopServices: 1.添加头文件 2.声明函数 3.操作 4.注册 5.qml调用 三.QFile: 1.添加头文件 2.声明函数 3.读取指定文件名的文件内容 4.注册 5.qml中调用 四.效果展示: 1.QDesktopServices:上方按钮点击打开…

纯血鸿蒙APP实战开发——Web获取相机拍照图片案例

介绍 本示例介绍如何在HTML页面中拉起原生相机进行拍照,并获取返回的图片。 效果预览图 使用说明 点击HTML页面中的选择文件按钮,拉起原生相机进行拍照。完成拍照后,将图片在HTML的img标签中显示。 实现思路 添加Web组件,设置…

一看就会的AOP事务

文章目录 AOPAOP简介AOP简介和作用AOP的应用场景为什么要学习AOP AOP入门案例思路分析代码实现AOP中的核心概念 AOP工作流程AOP工作流程AOP核心概念在测试类中验证代理对象 AOP切入点表达式语法格式通配符书写技巧 AOP通知类型AOP通知分类AOP通知详解 AOP案例案例-测量业务层接…

太极图形学——高级数据结构——稠密

太极是一个面向数据的编程语言 在并行计算的框架下,在计算上花费的时间反而是少数,大量的时间都花在了数据获取(也就是访问内存)上面,这一点在之前的games103课程上也有简单的提及 cpu的计算能力非常强大&#xff0c…

Qwen学习笔记3:Qwen模型调用外部API实现模型增强(openai的形式)

前言 本文记录了使用本地部署的Qwen模型,调用外部API实现模型的功能增强,非常的易用,大家用于开发自己的应用,只需要作简单的修改就可以进行使用了。 本文的代码来源视频教程: Qwen大模型变强了,通过API…

【SQL】SQL常见面试题总结(2)

目录 1、增删改操作1.1、插入记录(一)1.2、插入记录(二)1.3、插入记录(三)1.4、更新记录(一)1.5、更新记录(二)1.6、删除记录(一)1.7、…

【文末附gpt升级方案】腾讯混元文生图大模型开源:中文原生Sora同款DiT架构引领新潮流

在人工智能与计算机视觉技术迅猛发展的今天,腾讯再次引领行业潮流,宣布其旗下的混元文生图大模型全面升级并对外开源。这次开源的模型不仅具备强大的文生图能力,更采用了业内首个中文原生的Sora同款DiT架构,为中文世界的视觉生成领…

NodeJS V8引擎内存和垃圾回收器

关于max_old_space_size max_old_space_size参数用于指定V8引擎的老生代内存的最大大小。通过增加max_old_space_size参数的值,我们可以提供更多的内存给V8引擎,从而提高应用程序的性能和稳定性。 既然提到了老生代,就不得不提下什么是垃圾&…

IDEA 每次启动都显示选择项目页面

IDEA版本:2021.3.3 打开 Settings > Appearance & Behavior > System Settings 取消勾选 Reopen projects on startup 然后下次启动 IDEA 会显示选择项目页面

论文阅读 - Anatomy of an AI-powered malicious social botnet

论文链接: https://arxiv.org/pdf/2307.16336.pdf 目录 摘要 1引言 2 相关工作 2.1 LLM驱动的网络威胁 2.2 LLM生成的内容检测 2.3 社交机器人检测 2.4 由 LLM 增强的机器人 3 Fox8僵尸网络的识别 4 特性 4.1 配置文件 4.2 社交网络 4.3内容类型 4.4放…

全新多语言海外抢单刷单系统源码 订单自动匹配 支持分组 代理后台

安装教程 测试环境:Nginx PHP7.0 MySQL5.6 config/database 修改数据库 设置运行目录public 伪静态thinkphp 后台登录地址:/admin 账号admin 密码admin123 前端出现报错 删除runtime文件夹得缓存文件即可 源码免费下载地址抄笔记 (chaobiji.cn)

数据结构——冒泡排序

懒猫老师-数据结构-(63)冒泡排序(起泡排序)_哔哩哔哩_bilibili 交换排序的一类 基本思想 两两比较相邻记录的关键码,如果反序则交换,直到没有反序的记录为止。 过程 有序区不断扩大,无序区不断减小

vllm docker部署qwen等大模型推理;api post调用访问

参考: https://docs.vllm.ai/en/latest/serving/deploying_with_docker.html https://hub.docker.com/r/vllm/vllm-openai https://blog.csdn.net/weixin_42357472/article/details/136165481 下载镜像: docker pull vllm/vllm-openai 镜像默认最后一层就是python -m vllm.…

ModuleNotFoundError: No module named ‘sklearn‘

ModuleNotFoundError: No module named sklearn 解决办法: pip install scikit-learn

在win10折腾Flowise:部署和尝试

Flowise 是一种低代码/无代码拖放工具,旨在让人们轻松可视化和构建 LLM 应用程序。 本地部署 操作系统: win10 由于网络、操作系统等各种未知问题,使用npm install -g flowise的方式,尝试了很多次,都没有部署成功&am…

Python 白底黑字图片去除红色水印

Python 白底黑字图片去除红色水印 import os from PIL import Imagedef remove_color(image_path, new_image_path):"""初始化:param image_path: 图片路径:param new_image_path: 新图片路径"""# 打开图片并转换为RGBA格式img Image.open(imag…