【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721

news2024/9/22 13:44:55

1. 力扣19:删除链表的倒数第N个节点

1.1 题目:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

50aae73d0202402b89aad5a7aab14fd7.jpeg

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

示例 2:

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

示例 3:

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

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

进阶:你能尝试使用一趟扫描实现吗?

1.2 思考

简单的一个数学问题,假设这条链表的长度是k,我们要删除的是链表的倒数第n个节点。

要删除倒数第n个节点,其实就是要找到倒数第n+1个节点。

last节点走几步才能到倒数第n+1个节点呢?k - (n + 1)步。

front节点提前走k - (k - (n + 1))步,然后front,last一起走,直到front==null为止,此时last刚好停在倒数第n+1个节点上。

不懂的画个图就很好的理解了。

1.3 题解:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 因为头节点也又可能被删除,所以有必要添加一个哨兵节点
        ListNode dummy = new ListNode(10086, head);
        // 前后指针都从哨兵节点开始遍历
        ListNode front = dummy;
        ListNode last = dummy;
        // 为什么i要是n+1呢
        int i = n + 1;
        while(i-- > 0){
            front = front.next;
        }
        while(front != null){
            front = front.next;
            last = last.next;
        }
        // last指针的下一个节点就是要删除的节点
        last.next = last.next.next;
        return dummy.next;
    }
}

2. 力扣61:旋转链表

2.1 题目:

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

66457ead5be74d49ac2d858e5a19d702.jpeg

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

示例 2:

afd500cf4f904b2e89d2dc51aa34d624.jpeg

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

提示:

  • 链表中节点的数目在范围 [0, 500] 内
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 109

2.2 思考:

注释写的比较清楚了。

2.3 题解:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        // 如果空链表直接返回
        if(head == null){
            return null;
        }
        // k可能会非常大,可以把k变小一点
        ListNode p = head;
        int n = 0;
        while(p != null){
            n++;
            p = p.next;
        }
        // n不会为0,因为空链表的情况已经提前返回
        k = k % n;
        // k为0,相当于节点都不需要移动
        if(k == 0){
            return head;
        }

        // 头节点可能会发生修改,所以哨兵节点还是必要的
        ListNode dummy = new ListNode(10086, head);
        // 由题,每个节点向右移动k个位置
        // 找到倒数第k+1个位置,不断把倒数第k+1个位置的后面的节点
        // 移到链表的头部。
        ListNode front = dummy;
        ListNode last = dummy;
        int i = k+1;
        while(i-- > 0){
            front = front.next;
        }
        while(front != null){
            front = front.next;
            last = last.next;
        }
        // 此时last节点指向的就是倒数第k+1个节点
        // 从哨兵节点后开始,开始尾插法
        ListNode dummy_copy = dummy;
        while(last.next != null){
            ListNode delete = last.next;
            last.next = last.next.next;
            delete.next = dummy_copy.next;
            dummy_copy.next = delete;
            dummy_copy = delete;
        }
        return dummy.next;
    }
}

3. 力扣1721:交换链表中的节点

3.1 题目:

给你链表的头节点 head 和一个整数 k 。

交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。

示例 1:

 

f063ed5fe368a0b80bc6bdef3b6ca205.jpeg

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

示例 2:

输入:head = [7,9,6,6,7,8,3,0,9,5], k = 5
输出:[7,9,6,6,8,7,3,0,9,5]

示例 3:

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

示例 4:

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

示例 5:

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

提示:

  • 链表中节点的数目是 n
  • 1 <= k <= n <= 105
  • 0 <= Node.val <= 100

3.2 思考

看注释。

3.3 题解:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapNodes(ListNode head, int k) {
        // 空链表直接返回
        if(head == null){
            return null;
        }
        // 因为头节点可能会改变,所以哨兵节点有必要
        ListNode dummy = new ListNode(10086, head);
        ListNode front = dummy;
        ListNode last = dummy;
        // 假如链表的总长度为n
        // front走了k步,到达了链表正第k个节点,记录下来
        // 此时front和last一起走,一起走了(n - k)步
        // front==null时,last到达了链表倒数第k个节点
        // n - (n - k)从后i面数刚好是倒数第k个
        while(k-- > 0){
            front = front.next;
        }
        // 此时将front指向的节点记录下来
        ListNode p1 = front;

        while(front != null){
            front = front.next;
            last = last.next;
        }

        //此时将last指向的节点记录下来
        ListNode p2 = last;

        // 交换
        int temp;
        temp = p1.val;
        p1.val = p2.val;
        p2.val = temp;


        return dummy.next;
    }
}

 

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

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

相关文章

cache miss问题C++示例

原题是&#xff1a; const int LEN 64*1024*1024; int *arr new int[LEN]; for (int i 0; i < LEN; i 2) arr[i] * i; // 循环1 for (int i 0; i < LEN; i 8) arr[i] * i; // 循环2第二个循环比第一个循环少了四倍的计算量&#xff0c;理论上应该要快4倍&#xff…

深度解析RAG:你必须要了解的RAG优化方法

RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合检索和生成能力的技术框架&#xff0c;旨在通过从外部知识库中检索相关信息来增强生成模型的输出。其基本思想是利用大型语言模型&#xff08;LLM&#xff09;的生成能力&#xff0c;同时通过检索机制获取…

OpenStack × OceanBase: 打造高可用可扩展的基础设施平台

OceanBase 社区资深总监封仲淹在9月3日参加 OpenInfra 亚洲峰会中&#xff0c;分享了OceanBase与OpenStack的联合解决方案。本文将介绍这一联合方案的技术亮点及其为用户带来的独特价值。 OpenStack长期以来一直是云计算领域的先行者&#xff0c;通过提供强大的开源平台&#x…

西门子博途零基础学PLC必会的100个指令

#西门子##PLC##自动化##工业自动化##编程##电工##西门子PLC##工业##制造业##数字化##电气##工程师# 工控人加入PLC工业自动化精英社群 工控人加入PLC工业自动化精英社群

MATLAB求解0-1线性规划问题的详细分析

引言 0-1线性规划是整数规划中的一种特殊形式&#xff0c;它广泛应用于资源分配、工厂选址、投资组合优化、物流运输等多个领域。0-1线性规划的特点是&#xff0c;决策变量只能取0或1的离散值&#xff0c;通常用于描述“是-否”决策问题。随着计算机技术的发展&#xff0c;数学…

红日靶机(一) 笔记

红日靶机(一)笔记 概述 域渗透靶机&#xff0c;可以练习对域渗透的一些知识&#xff0c;主要还是要熟悉 powershell 语法&#xff0c;powershell 往往比 cmd 的命令行更加强大&#xff0c;而很多渗透开源的脚本都是 powershell 的。例如 NiShang&#xff0c;PowerView 等等。…

料品档案没有配置主供应商信息

这个问题经常会出现在普通用户的面前。没有合适的工程人员去打理料品档案。信息是缺漏的。用友给出来的提示&#xff0c;也让人摸不着头脑。只能是记下来备用吧。

Ai+若依(集成easyexcel实现excel表格增强)

EasyExcel 介绍 官方地址:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一…

Web3 项目安全手册

现如今针对 Web3 项目的攻击手法层出不穷&#xff0c;且项目之间的交互也越发复杂&#xff0c;在各个项目之间的交互经常会引入新的安全问题&#xff0c;而大部分 Web3 项目研发团队普遍缺少的一线的安全攻防经验&#xff0c;并且在进行 Web3 项目研发的时候&#xff0c;重点关…

JavaWeb中处理 Web 请求的方式总结

文章目录 JavaWeb中处理 Web 请求的方式总结1. 原始的 Servlet 方式1.1. 环境搭建**创建 Maven 或 Gradle 项目**&#xff1a;**添加 Servlet 依赖**&#xff1a;**创建 Servlet 类**&#xff1a;**配置项目**&#xff1a;**配置 Tomcat**&#xff1a; 1.2. 路由机制1.3. 示例代…

[产品管理-4]:NPDP新产品开发 - 2 - 制定企业经营战略目标的结构化方法与工具

目录 一、SWOT分析工具 1、SWOT分析工具概述 2、SWOT分析与企业战略目标制定的关系 3、SWOT分析在企业战略目标制定中的应用实例 4、SWOT分析的改进与应用建议 二、P E S T L E 分 析&#xff1a;外部环境分析 2.1 概述 1. 政治因素&#xff08;Political&#xff09; …

2024第三届大学生算法大赛 真题训练3 解题报告 | 珂学家

前言 题解 C. 洞穴探险 题目描述&#xff1a; 简单来说&#xff0c;就是 在一个无向图中&#xff0c;两个点之间关系 (存在多条简单路径&#xff0c;一条简单路径&#xff0c;不联通&#xff09;, 请判断两点之间的关系。 思路: 并查集 tarjan割边 对于通联和非联通&#x…

Java学习Day41:手刃青背龙!(spring框架之事务)

1.spring事务概念 在数据层和业务层保证一系列数据库操作原子性成功失败&#xff01;&#xff08;相比事务可以在业务层开启&#xff09; 1.事务定义&#xff1a;关键字&#xff1a;Transactional&#xff08;一般写在接口上&#xff09; 2.事务管理器&#xff1a;在JdbcCon…

vscode ssh离线远程连接ubuntu调试

遇见问题&#xff1a; 1 ssh连接上无法启动服务器的虚拟环境&#xff1b; 2 ssh连接上启动服务器的虚拟环境后无法打断点&#xff1b; 对于问题需要参考下面连接安装python和debugy的插件拓展&#xff0c;并且配置json文件link。VSCode - 离线安装扩展python插件教程_vscode…

web 自动化测试框架 TestCafe 安装和入门使用

一、TestCafe 介绍&#xff1a; TestCafe 是一款基于 Node.js 的端到端 Web 自动化测试框架&#xff0c;支持 TypeScript 或 JavaScript 来编写测试用例&#xff0c;运行用例&#xff0c;并生成自动化测试报告。 TestCafe 兼容 Windows&#xff0c;MacOS 和 Linux 系统&#x…

基于C++实现(控制台+界面)通讯录管理系统

个人通讯录管理系统 问题描述&#xff1a; 主要内容&#xff1a; 个人通讯录是记录了同学&#xff08;包含一起上学的学校名称&#xff09;、同事&#xff08;包含共事的单位名称&#xff09;、朋友&#xff08;包含认识的地点&#xff09;、亲戚&#xff08;包含称呼&#…

国家级|加速科技成功入选国家级专精特新“小巨人”企业

9月6日&#xff0c;浙江省通过的第六批专精特新“小巨人”企业名单在省经济和信息化厅官网完成公示&#xff0c;经过严格评审&#xff0c;杭州加速科技有限公司正式获国家级专精特新“小巨人”企业认定。 专精特新”小巨人”企业具备专业化、精细化、特色化、新颖化特征&#x…

“我”变小了但更强了!英伟达发布最新大语言模型压缩技术,无损性能且提升数倍!

1. 摘要 英伟达研究团队提出了一份全面报告&#xff0c;详细介绍了如何使用剪枝和蒸馏技术将Llama 3.1 8B和Mistral NeMo 12B模型分别压缩至4B和8B参数。他们探索了两种不同的剪枝策略&#xff1a;深度剪枝和联合隐藏/注意力/MLP&#xff08;宽度&#xff09;剪枝。 研究人员…

Adoptium Temurin JDK 的下载

在当今的软件开发领域&#xff0c;Java 无疑是最受欢迎和广泛使用的编程语言之一。Java 开发工具包&#xff08;JDK&#xff09;是任何 Java 开发者不可或缺的工具&#xff0c;它提供了编译、调试和运行 Java 应用程序所需的所有工具和库。Eclipse Temurin 是一个流行的开源 JD…

网络药理学:分子动力学模拟入门、gromacs能量最小化

推荐视频 B站&#xff1a; 讲的都是有效的概论&#xff0c;其中关于分子动力学模拟归纳的三步挺有用的。 B站&#xff1a;也没有讲清楚关于分子对接后得到的文件该如何处理。 B站&#xff1a; 需要用的是autodock vina&#xff0c;而且走过一遍up主之前分子对接的视频才比较…