【链表OJ题 1】反转链表

news2024/11/17 13:57:58

目录

题目来源:

代码实现

1、方法一

1.1分析

2、方法二

2.1 分析


题目来源:

力扣

题目描述:

 

代码实现

1、方法一

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* prev = NULL, * cur = head;
    while (cur)
    {
        struct ListNode* next = cur->next;
        //头插
        cur->next = prev;
        prev = cur;
        //迭代
        cur = next;
    }
    return prev;
}

1.1分析

方法一是头插法。

创建三个结构体指针变量:prev、cur、next。

我们先置空 prev,将头指针 head 存放在 cur 中,next 存放 cur 的 next。第一次 cur 的 next 赋值为 prev 就是空,next 指向 cur的next,prev 指向当前的 cur。不断循环,当 cur 为空时就将整个链表反转完成了。

重点:

1.循环:next = cur->next; cur->next = prev; prev = cur; cur = next; 这个循环体的顺序是不可以交换的。 循环条件应该是 cur != NULL 时就进入循环,等于 NULL 的话就说明全部的结点头插已经完成了。

2.返回值:因为是头插,prev 一直指向头结点,所以返回 prev。return prev;

2、方法二

struct ListNode* reverseList(struct ListNode* head) {
    if(head == NULL)
        return NULL;

    struct ListNode* n1 = NULL, * n2 = head, * n3 = n2->next;
    while (n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n2 != NULL)
            n3 = n3->next;
    }
    return n1;
}

2.1 分析

方法二是逆置法,将开始向右的箭头改为向左就逆置成功了。

创建三个结构体指针变量:n1、n2、n3。

先置空 n1 ,将 head 存放在 n2 中,n3 保存 n2的next。将 n2的next 指向 n1,这样就可以让头结点的next指向空;然后将 n1 赋值为 n2;再将 n2 赋值为 n3;n2 如果指向的结点不为空,n3 就在自己的基础上再往后走一步。

重点:

1.如果原链表为空,就返回NULL;

2.循环:n2->next = n1; n1 = n2; n2 = n3; n3 = n3->next; 这个循环体的顺序是不可以交换的。以我们的图来看,当 n2 为空的时候循环停止,因此循环条件为 n2(n2 != NULL 与 n2 是一样的)。

3.返回值:我们的 n2 走到 NULL 的时候,n1 正好就指向了原链表的尾结点,因为是逆置,所以返回的就是尾结点。return n1;

4.循环体中,最后一次改变 n3 时 n3 已经是空了,再让 n3 = n3 ->next, 会出现空指针问题,因此我们在 n3 的改变上加一个判断条件 n3 != NULL,如果为空 n3 就不再往后移了。

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

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

相关文章

基础IO+文件

基础IO 回顾文件回顾文件操作库函数调用接口写文件-w读文件-r 系统调用打开文件-open写文件-write 文件操作本质文件描述符fd文件描述符的分配规则重定向 FILE缓冲区模拟实现缓冲区总结 理解文件系统磁盘物理结构存储结构逻辑结构 文件系统软硬链接 动静态库动态库和静态库生成…

Kafka上的优化经验

1. 平滑扩容 Motivation kafka扩容⼀台新机器的流程 假如集群有 3 个 broker ,⼀共有 4 个 TP ,每个 3 副本,均匀分布。现在要扩容⼀台机器, 新 broker 加⼊集群后需要通过⼯具进⾏ TP 的迁移。⼀共迁移 3 个 TP 的副…

JavaScript高级程序设计(第2版)——读书笔记

文章目录 第1章 JavaScript简介第2章 在HTML中使用JavaScript第3章 基本概念第4章 变量、作用域、内存问题第5章 引用类型第6章 面向对象的程序设计第7章 匿名函数第8章 BOM第9章 客户端检测第10章 DOM第11章 DOM2和DOM3第12章 事件第13章 表单脚本第14章 错误处理与调试第15章…

java 的参数传递

一、疑惑引入 首先&#xff0c;我们从一个例子来引出这个问题&#xff1a; public static void main(String[] args) throws IOException {List<String> mockList Lists.newArrayList("a", "b");System.out.println("1: " mockList);L…

【GAMES101】04 Viewing Transformation

1.View/Camera Transformation&#xff08;视图变换&#xff09; 1、将准备拍摄的对象移动到场景中指定位置。&#xff08;模型变换&#xff0c;Model Transform&#xff09; - 模型导入场景中从模型坐标系转换成世界坐标系 2、将相机移动到准备拍摄的位置&#xff0c;将它对准…

【网络】-- TCP协议

其中TCP就属于传输层&#xff0c;并且端口号也是在传输层起作用。 目录 TCP协议报头 可靠性 32位序号 16位窗口大小 六个标记位 三次握手四次挥手 RST PSH URG 16位紧急指针 FIN socksetopt 可靠性机制 确认应答(ACK)机制 超时重传机制 连接管理机制 三大机…

03-角色维护 尚筹网

一、分页操作 目标 将角色数据进行分页显示 思路 点击后台主页面的权限管理->角色维护&#xff0c;通过view-controller进入角色分页显示的页面&#xff0c;浏览器加载页面的数据并初始化一些数据&#xff08;页码、页大小、关键词等&#xff09;&#xff0c;调用分页函…

基于Open3D的点云处理3-可视化

可视化接口 API open3d.visualization.draw_geometries(*args, **kwargs)重载函数1 draw_geometries(geometry_list, window_name’Open3D’, width1920, height1080, left50, top50, point_show_normalFalse, mesh_show_wireframeFalse, mesh_show_back_faceFalse)geometry…

B树

文章目录 B树的定义和性质为什么需要B树B树的定义 B树的模拟实现节点的数据结构B树的插入B树的删除 B树的模拟实现 B树的定义和性质 我们之前已经对 平衡搜索二叉树有了一定的了解&#xff0c;学习了两种树——AVL树 和 红黑树&#xff0c;下面介绍一下B树 为什么需要B树 数…

Nacos 服务网格⽣态

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

为一加七Pro(LineageOs17.1 4.14内核版本)编译KernelSu

编译内核 因为一加七的内核版本是4.14&#xff0c;所以想使用kernelsu&#xff0c;需要自己将kernelsu编译到内核里。 我使用的系统是&#xff1a;LineageOS17.1&#xff0c;对于之后的lineage版本同样适用&#xff0c;只是拉取的源代码不一样。刷机教程请看&#xff1a;wsl2…

vue diff算法与虚拟dom知识整理(3) 了解h函数和虚拟节点概念 实现虚拟节点上dom树

虚拟dom之前我们也有了基本的了解 简单说 就是用js数据结构来描述html的dom结构树 首先 为什么要用虚拟dom啊&#xff1f; 官方给出的回答是 diff最小量精细化算法是发生在虚拟dom上的 也就是 我们之前说的 节点与节点比较 并不是发生在html元素上的 而是发生在js中的虚拟dom上…

【C++学习】类和对象--多态【待补充】

多态的基本语法 多态是C面向对象三大特性之一 静态多态&#xff1a; 函数重载和运算符重载属于静态多态&#xff0c;复用函数名&#xff08;函数地址早绑定&#xff0c;编译阶段确定函数地址&#xff09; 动态多态&#xff1a; 派生类和虚函数实现运行时多态&#xff08;函数地…

centos7.6 yum 安装mysql

目录 1. 删 mariadb / 自带MySQL 2 安装wget命名 3 下载并安装MySQL官方的 Yum Repository 4 使用yum安装mysql 5 启动 6 获取密码 7 登录 -> 没有获取到 就直接按回车 不输入 8 设置密码 及权限 --> root 账号所有语句报错 9 参考 1. 删 mariadb / 自带MySQL…

《计算机网络——自顶向下方法》精炼——2.7.2(TCP套接字编程)

“学习的敌人是自己的满足。” —— 叶圣陶 文章目录 TCP套接字编程TCP套接字编程概述客户进程服务器进程 TCP套接字编程 TCP套接字编程概述 TCP是一个面向连接的运输层协议&#xff0c;因此可以分为发起连接的阶段和传输阶段。 发起连接时&#xff0c;客户进程创建一个客户…

【LeetCode】221.最大正方形

221.最大正方形&#xff08;中等&#xff09; 题解 对于在矩阵内搜索正方形或长方形的题型&#xff0c;一种常见的做法是&#xff1a;定义一个二维 dp 数组&#xff0c;其中 dp[i][j] 表示满足题目条件的、以&#xff08;i,j&#xff09;为右下角的正方形或长方形属性。在本题中…

【备战蓝桥杯国赛-国赛真题】费用报销

题目链接&#xff1a;https://www.dotcpp.com/oj/problem2696.html 思路 读完题&#xff0c;再看一眼数据范围&#xff0c;这道题的做法也就确定了——DP。 DP的题目往往很容易辨识出来&#xff0c;所以我们就往DP上想了&#xff0c;第一要素是选出的所有票据里面&#xff0c…

【LeetCode】64. 最小路径和

64. 最小路径和&#xff08;中等&#xff09; 方法一&#xff1a;常规动态规划 思路 定义一个二维 dp 数组&#xff0c;其中 dp[i][j]表示从左上角开始到&#xff08;i, j&#xff09;位置的最优路径的数字和。因为每次都只能向下或者向右移动&#xff0c;所以很容易发现 dp数组…

汽车行业V模型开发详解

在新能源汽车开发过程中&#xff0c;通常会采用V模型&#xff08;V-Model&#xff09;进行系统开发。V模型是一种基于需求分析、体系架构设计、硬件和软件开发、集成测试以及产品验证的系统工程方法。 下面简要介绍新能源汽车V模型开发的主要阶段&#xff1a; V模型开发&…

encrypted勒索病毒攻击nas服务器,服务器中了勒索病毒解密数据恢复

近年来&#xff0c;勒索病毒的攻击技术不断升级&#xff0c;各种加密型的病毒不断出现&#xff0c;给我们工作和生活带来了很大困扰。其中&#xff0c;encrypted勒索病毒攻击NAS网络存储设备已经变得越来越常见。而这次我们将为大家探讨如何预防encrypted勒索病毒攻击NAS服务器…