反转链表与拓展【灵神基础精讲】

news2025/1/12 23:03:28

来源0x3f:https://space.bilibili.com/206214

文章目录

  • 反转链表
    • [206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)
    • [92. 反转链表 II](https://leetcode.cn/problems/reverse-linked-list-ii/)
    • [25. K 个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/)
  • 拓展
    • [剑指 Offer 06. 从尾到头打印链表](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/)

反转链表

206. 反转链表

难度简单2859

给你单链表的头节点 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

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

图片来自:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-shuang-zhi-zhen-di-gui-yao-mo-/

递归

img

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) 
            return head;//确保有头结点
        ListNode cur = reverseList(head.next);
        // 翻转头节点 第二个节点的指向
        head.next.next = head;
        // 此时的 head 节点为尾节点,next 需要指向 NULL
        head.next = null;
        return cur;
    }
}

迭代

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null; // 前指针结点
        ListNode cur = head; // 当前指针结点
        while(cur != null){
            ListNode tmp = cur.next; //临时结点保存遍历顺序
            cur.next = pre; //将当前节点指向它前面的节点
            pre = cur; //前指针后移
            cur = tmp; //当前指针后移
        }
        return pre;
    }
}

头插法

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode p = head;
        ListNode res = new ListNode(-1, null);
        while(p != null){
            ListNode tmp = p.next;
            p.next = res.next;
            res.next = p;
            p = tmp;
        }
        return res.next;
    }
}

92. 反转链表 II

难度中等1446

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

img

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

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

进阶: 你可以使用一趟扫描完成反转吗?

性质:反转结束后,从原来的链表上看:

  • pre指向反转这一段的末尾
  • cur指向反转这一段后续的下一个结点
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode dummy = new ListNode(-1);// 初始化哨兵结点,使得处理第一个结点与第i个结点相同
        dummy.next= head;
        ListNode p0 = dummy;
        // 找到要反转的链表左侧的上一个结点
        for(int i = 0; i < left-1; i++){
            p0 = p0.next;
        } 
        ListNode pre = null;
        ListNode cur = p0.next;
        for(int i = 0; i < right-left+1; i++){
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        p0.next.next = cur;
        p0.next = pre;
        return dummy.next;
    }   
}

25. K 个一组翻转链表

难度困难1857

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

img

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

示例 2:

img

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

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

**进阶:**你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        //统计一下链表长度
        int n = 0;
        ListNode cnt = head;
        while(cnt != null){
            n++;
            cnt = cnt.next;
        }
        ListNode dummy = new ListNode(-1);// 初始化哨兵结点,使得处理第一个结点与第i个结点相同
        dummy.next= head;
        ListNode p0 = dummy;

        while(n >= k){ // 循环n/k次
            n -= k;
            ListNode pre = null;
            ListNode cur = p0.next;
            for(int i = 0; i < k; i++){
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
            }
            ListNode nxt = p0.next;
            p0.next.next = cur;
            p0.next = pre;
            p0 = nxt;
        }
        return dummy.next;
    }
}

拓展

剑指 Offer 06. 从尾到头打印链表

难度简单354

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

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

限制:

0 <= 链表长度 <= 10000

从尾到头打印的过程就是递归的过程

class Solution {
    List<Integer> tmp = new ArrayList<>();
    public int[] reversePrint(ListNode head) {
        recur(head);
        int[] res = new int[tmp.size()];
        for(int i = 0; i < res.length; i++){
            res[i] = tmp.get(i);
        }
        return res;
    }
    void recur(ListNode head){
        if(head == null) return;
        recur(head.next);
        tmp.add(head.val);
    }
}

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

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

相关文章

[附源码]Python计算机毕业设计Django仓储综合管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

windows改linux

使用旧的windows电脑改成linux机器&#xff0c;不使用双系统&#xff0c;直接格式化 本次需要两个U盘或者两台电脑。 制作WINPE启动盘 使用U深度制作启动盘&#xff0c;制作完成后进入PE系统&#xff0c;然后使用diskGenius删除所有电脑的分区进行快速分区&#xff0c;格式选…

R语言主成分回归(PCR)、 多元线性回归特征降维分析光谱数据和汽车油耗、性能数据...

原文链接&#xff1a;http://tecdat.cn/?p24152什么是PCR&#xff1f;&#xff08;PCR PCA MLR&#xff09;&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。• PCR是处理许多 x 变量的回归技术• 给定 Y 和 X 数据&#xff1a;• 在 X 矩阵上进行 PCA– 定…

力扣(LeetCode)116. 填充每个节点的下一个右侧节点指针(C++)

模拟 这题可以直接操作根节点&#xff0c;我们保存根结点&#xff0c;用作最终返回值。 填充每个结点的 nextnextnext 指针&#xff0c;其实是树的层序遍历。由于 nextnextnext 指针的存在&#xff0c;我们可以做到 O(1)O(1)O(1) 的空间复杂度。 算法: 从根结点出发&#xf…

自动驾驶专题介绍 ———— 动力传动系统

文章目录动力传动系统传统动力传动系统混合动力传动系统串联型并联型串并联型纯电动传动系统电机中央驱动电动轮驱动动力传动系统 汽车动力传动系统是位于发动机和驱动车轮之间的动力传动装置&#xff0c;其基本功用是将发动机发出的动力传输给驱动车轮&#xff0c;以保障汽车在…

JavaWeb简单实例——jQuery

简单介绍&#xff1a; 在之后的学习中&#xff0c;我们会接触到Ajax异步请求&#xff0c;这个异步请求需要我们在网页端使用JS来发送&#xff0c;而使用原生的Ajax请求比较复杂&#xff0c;所以我们就借用一个前端框架封装后的Ajax请求&#xff0c;这样可以简化我们的代码编写…

大坝安全动态监管预警系统 大坝安全监测平台 遥测终端机 水位雨量监测站

平升电子大坝安全动态监管预警系统/大坝安全监测平台/大坝安全监测系统根据SL551-2012《土石坝安全监测技术规范》的整编要求&#xff0c;设置了变形监测、渗流监测、环境量监测。借助该系统可及时了解大坝的工作性态和水库可能存在的事故隐患&#xff0c;为大坝安全管理与水库…

Linux 安装 ElasticSearch

注意事项&#xff1a; 内存不能太小&#xff0c;否则会启动失败JDK版本需要对应&#xff0c;es7 需要 Java 11不能以 root 用户启动 平台确认 大家可以自行安装虚拟机部署&#xff0c;有条件可以在服务器操作。 安装Java 安装 Elasticsearch 之前&#xff0c;你需要先安装一个较…

04. 组合总和

1.题目链接&#xff1a; 39. 组合总和 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给定一个“无重复数组candidates”和一个“目标和target” &#xff0c;要求在给定 数组candidates 的范围内&#xff0c;输出和等于 目标和target 的组合&#xff0c;此组合元素可重复…

Java程序员:三个月刷完1000道面试真题,没想到老板直接给我升职了

同事&#xff1a;前阵子听说你要跳槽&#xff0c;现在准备得怎么样啊&#xff1f;程序员T&#xff1a;不跳了同事&#xff1a;啊&#xff1f;为什么&#xff1f;程序员T&#xff1a;涨薪了呗&#xff1f;同事&#xff1a;真的吗&#xff1f;涨了多少&#xff1f;你自己跟老板谈…

卓豪再签洛钼集团,实现AD域自动化管理有效降低管理人员工作负荷

2022年11月&#xff0c;ManageEngine卓豪续签上海董禾商贸有限公司&#xff0c;将为“洛钼集团”部署ADManager Plus软件&#xff0c;助力IT管理摆脱复杂AD域管理操作&#xff0c;实现AD域管理自动化。 上海董禾商贸 上海董禾商贸有限公司作为洛钼集团在上海的主体公司。洛阳栾…

2.9.39:Flexmonster:网络报告数据透视表组件

用于网络报告的数据透视表组件 用于可视化业务数据的最强大的 JavaScript 工具 与任何技术堆栈集成 该组件可与任何技术堆栈无缝协作&#xff1a; 与Angular、React、jQuery、Vue等 完美集成 没有服务器端依赖 只需几行代码即可开始使用。 加载海量数据集 即使有超过一百万行…

珠宝商城小程序开发的价值和优势

珠宝行业的巨大利润空间就决定了行业内激烈的竞争压力&#xff0c;而随着时代的发展&#xff0c;单一的线下门店营销方式很难让珠宝行业得到更好的发展。为了防止顾客流失&#xff0c;挖掘潜在的消费潜力&#xff0c;珠宝行业开始向科技化、互联网化、移动化的方向开拓市场&…

Sentinel-2(哨兵2数据介绍)

哥白尼 Sentinel-2&#xff08;哨兵 2&#xff09;计划是一个由两颗相同的 Sentinel-2 极轨卫星组成的星座&#xff0c;两颗卫星相位差 180&#xff0c;运行在平均高度 786 km 的太阳同步轨道上。每颗卫星在其轨道上的位置由双频全球导航卫星系统&#xff08;GNSS&#xff09;接…

Kubernetes资源调度之污点与Pod容忍度

Kubernetes资源调度之污点与Pod容忍度 概述 污点是定义在节点之上的键值型属性数据&#xff0c;用于让节点有能力主动拒绝调度器将Pod调度运行到节点上&#xff0c;除非该Pod对象具有接纳节点污点的容忍度。容忍度(tolerations)则是定义在Pod对象上的键值型属性数据&#xff0c…

WAVE SUMMIT+2022明日开场,六大看点不容错过!

在2022年最后一个乐章奏响之前&#xff0c;WAVE SUMMIT第八届峰会将率先拉开帷幕。11月30日&#xff0c;由深度学习技术及应用国家工程研究中心主办、百度飞桨承办的WAVE SUMMIT2022深度学习开发者峰会将以网上直播的方式呈现。明日14点&#xff0c;冬日AI盛会WAVE SUMMIT2022将…

.Net 7 Native AOT 单文件 无依赖 跨平台

2022.11.18 Native AOT 正式发布&#xff0c;不再是 实验性项目。 .Net 7 Console App & WebApi 使用PublishAOT true&#xff0c;直接编译 成exe&#xff0c;无rutime依赖&#xff0c;智能裁剪&#xff0c;体积小&#xff0c;启动快。 环境&#xff1a; 1.更新VS2022 …

安科瑞智能余压监控系统余压控制器ARPM-C 监控余压值/接收报警信息

1、概述 ARPM-C型余压控制器&#xff0c;可监控所连接余压探测器的余压值&#xff0c;接收余压探测器的报警信息&#xff0c;并向余压监控器反馈现场工作状态&#xff0c;当余压过高报警时联动风阀执行器调节泄压阀&#xff0c;能够持续调节泄压阀的开启角度。 2、产品型号 …

Java JUC并发容器之BlockingQueue的多种实现详解

Java JUC并发容器之BlockingQueue的多种实现详解 文章目录Java JUC并发容器之BlockingQueue的多种实现详解BlockingQueueArrayBlockingQueueLinkedBlockingQueueLinkedBlockingQueue和ArrayBlockingQueue的差异PriorityBlockingQueueDelayQueueSynchronousQueueBlockingQueue …

首次公开,GitHub点击破百万的分布式高可用算法小册被我扒下来了

想成为分布式高手&#xff1f;那就先把协议和算法烂熟于心吧&#xff01;这就不得不提到著名的——《分布式高可用算法》&#xff01; 目前网上还没有开源版本&#xff0c;今天我就当一次“互联网雷锋” &#xff0c;免费获取方式我放在文末了 作者介绍 江峰&#xff0c;教授…