【无标题】力扣链表总结

2023-10-26

k个一组反转链表(25)

前置知识1.2.

  1. 反转整个链表

// 反转以 a 为头结点的链表
ListNode reverse(ListNode a) {
ListNode pre, cur, nxt;
pre = null; cur = a; nxt = a;
while (cur != null) {
nxt = cur.next;
// 逐个结点反转
cur.next = pre;
// 更新指针位置
pre = cur;
cur = nxt;
}
// 返回反转后的头结点
return pre;
}

// 反转以 a 为头结点的链表
ListNode reverse(ListNode a) {
    ListNode pre, cur, nxt;
    pre = null; cur = a; nxt = a;
    while (cur != null) {
        nxt = cur.next;
        // 逐个结点反转
        cur.next = pre;
        // 更新指针位置
        pre = cur;
        cur = nxt;
    }
    // 返回反转后的头结点
    return pre;
}
  1. 给定开始结点和结束结点反转链表
    上面是因为结束结点为空,所以while循环是cur!=null,如果结束结点不为空,则while循环中条件是cur!=b,a到b是左闭右开转态
    将结束结点带入循环内判断就行了
// 反转以a到b之间的链表
ListNode reverse(ListNode a,ListNode b) {
    ListNode pre, cur, nxt;
    pre = null; cur = a; nxt = a;
    while (cur != b) {
        nxt = cur.next;
        // 逐个结点反转
        cur.next = pre;
        // 更新指针位置
        pre = cur;
        cur = nxt;
    }
    // 返回反转后的头结点
    return pre;
}
  1. 进行解题思路

1、找到待翻转的k个节点(注意:若剩余数量小于 k 的话,则不需要反转,因此直接返回待翻转部分的头结点即可)。
2、对其进行翻转。并返回翻转后的头结点(注意:翻转为左闭又开区间,所以本轮操作的尾结点其实就是下一轮操作的头结点)。
3、对下一轮 k 个节点也进行翻转操作。
4、将上一轮翻转后的尾结点指向下一轮翻转后的头节点,即将每一轮翻转的k的节点连接起来。
在这里插入图片描述

  1. K个一组反转
ListNode reverseKGroup(ListNode head, int k) {
        if (head == null) return null;
        // 区间 [a, b) 包含 k 个待反转元素
        ListNode a, b;
        a = b = head;
        for (int i = 0; i < k; i++) {
            // 不足 k 个,不需要反转,base case
            if (b == null) return head;
            b = b.next;
        }
        // 反转前 k 个元素
        ListNode newHead = reverse(a, b);
        // 递归反转后续链表并连接起来
        a.next = reverseKGroup(b, k);
        return newHead;
    }

    ListNode reverse(ListNode a, ListNode b) {
        ListNode pre, cur, nxt;
        pre = null; cur = a; nxt = a;
        // while 终止的条件改一下就行了
        while (cur != b) {
            nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        // 返回反转后的头结点
        return pre;
    }

环形链表(141)

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null||head.next==null)
        return false;
        ListNode fast=head;
        ListNode slow=head;
        while(fast.next!=null&&fast.next.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow){
                return true;
            }
        }
        return false;
    }
}

环形链表||(142)

解题思路参考https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/linked-list-cycle-ii-kuai-man-zhi-zhen-shuang-zhi-/
参考了它的代码
使用快慢指针。快的每次走两步,慢的每次走一步。
另一种清晰的解释
在这里插入图片描述
L=N*C-X
也就是说,head与相遇点的指针同时向后移动,相遇时,就是环的入口。(令N=1)

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast=head;
        ListNode slow=head;
        while(true){
            if(fast==null||fast.next==null)return null;
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow)break;

        }
        fast=head;
        while(slow!=fast){
                slow=slow.next;
                fast=fast.next;
        }
        return fast;
        
    }
}

测试代码及结果

	 public static ListNode detectCycle(ListNode head) {
	        ListNode fast=head;
	        ListNode slow=head;
	        while(true){
	            if(fast==null||fast.next==null)return null;
	            fast=fast.next.next;
	            slow=slow.next;
	            if(fast==slow)break;

	        }
	        fast=head;
	        while(slow!=fast){
	                slow=slow.next;
	                fast=fast.next;
	        }
	        return fast;
	        
	    }
	 public static void main(String[] args) {
		 //构造一个环形链表,5-3-2-7-1-6-8-9-4-1,环的入口在1
			ListNode node1=new ListNode(5);
			ListNode node2=new ListNode(3);
			ListNode node3=new ListNode(2);
			ListNode node4=new ListNode(7);
			ListNode node5=new ListNode(1);
			ListNode node6=new ListNode(6);
			ListNode node7=new ListNode(8);
			ListNode node8=new ListNode(9);
			ListNode node9=new ListNode(4);
			node1.next=node2;
			node2.next=node3;
			node3.next=node4;
			node4.next=node5;
			node5.next=node6;
			node6.next=node7;
			node7.next=node8;
			node8.next=node9;
			node9.next=node5;
			System.out.println(detectCycle(node1).val);//输出1		
		}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【无标题】力扣链表总结 的相关文章

  • java中如何进行日期时间比较?4种方法介绍

    1 Date compareto java util Date提供了在Java中比较两个日期的经典方法compareto 1 如果两个日期相等 则返回值为0 2 如果Date在date参数之后 则返回值大于0 3 如果Date在date参数
  • Docker 应用部署

    文章目录 一 部署 MySQL 二 部署 Tomcat 三 部署 Nginx 四 部署 Redis 提示 以下是本篇文章正文内容 Docker 系列学习将会持续更新 一 部署 MySQL 搜索并拉取 mysql 镜像 docker sear
  • 最近碰到的一个关于memcpy的奇葩问题

    最近写代码 碰到一个奇葩问题 memcpy函数用起来 编译居然提示我stackoverflow 简直是对写C的码农的最大羞辱 WTF UINT8 numBuffers 0 UINT16 cpLength 0 TPM2B DIGEST buf
  • 排序和复杂度

    常见的排序方式 1 冒泡排序 时间复杂度 最好情况是 O n 最坏情况是 O n2 空间复杂度 开辟一个空间交换顺序O 1 2 快速排序 时间复杂的 最好情况是 O nlogn 最坏情况是 O n2 空间复杂度 最好的情况 每一次base值
  • 结构型模式之外观模式

    复习用 不适合初学 复习用 不适合初学 复习用 不适合初学 定义 Facade Pattern 外部与一个子系统的通信必须通过一个统一的外观对象进行 为子系统中的一组接口提供一个一致的界面 外观模式定义了一个高层接口 这个接口使得这一子系统

随机推荐

  • collate chinese_prc_ci_as null解说

    我们在create table时经常会碰到这样的语句 例如 password nvarchar 10 collate chinese prc ci as null 那它到底是什么意思呢 不妨看看下面 首先 collate是一个子句 可应用于
  • 计算机程序的思维逻辑 (12) - 函数调用的基本原理

    栈 上节我们介绍了函数的基本概念 在最后我们提到了一个系统异常java lang StackOverflowError 栈溢出错误 要理解这个错误 我们需要理解函数调用的实现机制 本节就从概念模型的角度谈谈它的基本原理 我们之前谈过程序执行
  • 小知识·PD充电协议

    目录 PD充电器硬件结构 pd充电协议是什么 pd协议快充什么意思 PD快充协议优势 USB PD快速充电通信原理 PD充电器硬件结构 典型的手机充电器的硬件结构 以基于Dialog方案的高通QC2 0快充协议为例 如图1所示 iW626作
  • dd命令测试linux磁盘io情况,详解三种Linux测试磁盘IO性能的方法总结

    概述 在磁盘测试中我们一般最关心的几个指标分别为 iops 每秒执行的IO次数 bw 带宽 每秒的吞吐量 lat 每次IO操作的延迟 当每次IO操作的block较小时 如512bytes 4k 8k等 测试的主要是iops 当每次IO操作的
  • [C语言]如何使用C语言创建题库,进行高效刷题?

    事情是这样的 鄙人的学校开展了一个校内的知识竞赛 赛事主办方提供给了我们一个题库进行练习 但是是Word版本的 题目量不多 单选题 也就 140多道题目 当然 我们完全可以对着那个枯燥无味的Word文档进行死记硬背 但是 身为一名计算机专业
  • python - 例题分析:工时与工资

    工时在120到180 工资80 工时 工时超过180 超过部分奖励20 工时不足120 扣10 t int input 输入工时 1退出 while t 1 if t gt 120 and t lt 180
  • 3 关于QT中的MainWindow窗口,MenuBar ToolBar QuickTip等方面的知识点

    首先给大家分享一个巨牛巨牛的人工智能教程 是我无意中发现的 教程不仅零基础 通俗易懂 而且非常风趣幽默 还时不时有内涵段子 像看小说一样 哈哈 我正在学习中 觉得太牛了 所以分享给大家 点这里可以跳转到教程 1新建一个空Qt项目 编写12M
  • TP框架中, _initialize函数使用return 语句无法返回相应内容,同时也无法终止脚本继续执行

    tp框架中 initialize函数使用return 语句无法返回相应内容 同时也无法终止脚本继续执行 在 initialize中如果想要返回值 需要 使用echo 如 echo json encode code gt 0 msg gt 请
  • synchronized对于加锁代码块、方法以及全局(static)锁的详细对比

    在网上看了许多关于synchronized的介绍及用法区别 大多大同小异 点到为止 个人推荐一篇博友写的 网址如下 http blog csdn net cs408 article details 48930803 这篇博客是介绍对象锁和类
  • LeetCode--标签:数组31.下一个排列

    LeetCode 31 下一个排列 做题笔记 题目描述 解题思路 代码 java 题目描述 实现获取下一个排列的函数 算法需要将给定数字序列重新排列成字典序中下一个更大的排列 如果不存在下一个更大的排列 则将数字重新排列成最小的排列 即升序
  • 目标检测之YOLO系列

    文章目录 YOLO 整体结构 YOLO的核心思想 实现方法 损失函数 训练 预测 优缺点 YOLO V2 模型结构 改进策略 训练 YOLO9000 YOLOv3 改进点 YOLOv3结构 与其他模型对比结果 YOLO 整体结构 源码 de
  • 系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

    系统 等保三级 CentOS Linux 7合规基线检查 shell脚本 bin bash 基于阿里云最佳实践安全实践的CentOS Linux 7基线标准 系统 等保三级 CentOS Linux 7合规基线检查 修改密码最大有效期为18
  • ceph学习(3)——rbd-mirror双机热备

    一 概述 本文主要关注于rbd mirror的使用以及使用过程中的遇到的问题 二 环境准备 ceph版本 14 2 16 服务器 3台centos7服务器 ceph1 ceph2 ceph3 硬盘 每台服务器1块10GB以上硬盘做osd 分
  • <七>、Hadoop Web项目--HDFS文件管理

    本博客参考 http blog csdn net fansy1990 article details 51356583 一 项目介绍 推荐系统的web项目已经完成 现在在此基础上增加HDFS文件管理功能 便于管理HDFS上的文件数据 本文基
  • 面试题创作0009,请问Linux kernel中的spinlock_t 是如何实现互斥访问同一数据的?

    面试题创作0007 请问Linux kernel中的spinlock t 是如何实现互斥访问同一数据的 在单核多线程 多核多线程 多cpu多线程中 spinlock t实现互斥的机制有区别么 分别是什么呢 进一步列举一些使用spinlock
  • PLC是如何控制伺服电机的?

    在回答这个问题之前 首先要清楚伺服电机的用途 相对于普通的电机来说 伺服电机主要用于精确定位 因此大家通常所说的伺服控制 其实就是对伺服电机的位置控制 其实 伺服电机还用另外两种工作模式 那就是速度控制和转矩控制 不过应用比较少而已 速度控
  • Java通过反射模拟冰蝎免杀功能

    一 Java反射 java反射算是java学习过程中不可绕过的一关 java 反射 反射允许运行中的Java程序获取自身的信息 并且可以操作类或对象的内部属性 反射的核心是JVM在运行时动态加载类或调用方法或访问属性 class 类 我们正
  • 前端模块化:匿名闭包、CommonJS、ES6模块化

    ES5时 用匿名函数实现的模块化 通过将代码放在闭包当中 使得命名不会冲突 每一个js文件都成为独立的模块 需要复用代码时 将闭包中的结构返回到全局作用域即可 通过模块名 方法 属性的方法使用 a js var moduleA functi
  • 2022年第十四届“华中杯”大学生数学建模挑战赛

    2022年第十三届 华中杯 大学生数学建模挑战赛 为了推广我国高校数学建模实践教学 培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力 第十四届 华中杯 大学生数学建模挑战赛 以下简称竞赛 将于2022年3月开始 举办竞赛的目的
  • 【无标题】力扣链表总结

    k个一组反转链表 25 前置知识1 2 反转整个链表 反转以 a 为头结点的链表 ListNode reverse ListNode a ListNode pre cur nxt pre null cur a nxt a while cur