[Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

【问题描述】[第25题][K个一组反转链表][困难]

时间复杂度:O(N^2)    空间复杂度:O(1)
```java
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5说明:你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

【解答思路】

1. 图解大法

1.链表分区为已翻转部分+待翻转部分+未翻转部分
2.每次翻转前,要确定翻转链表的范围,这个必须通过 k 此循环来确定
3.需记录翻转链表前驱和后继,方便翻转完成后把已翻转部分和未翻转部分连接起来
4.初始需要两个变量 pre 和 end,pre 代表待翻转链表的前驱,end 代表待翻转链表的末尾
5.经过k此循环,end 到达末尾,记录待翻转链表的后继 next = end.next
6.翻转链表,然后将三部分链表连接起来,然后重置 pre 和 end 指针,然后进入下一次循环
7.特殊情况,当翻转部分长度不足 k 时,在定位 end 完成后,end==null,已经到达末尾,说明题目已完成,直接返回即可
时间复杂度为 O(n*K) 最好的情况为 O(n) 最差的情况未 O(n^2)
空间复杂度为 O(1)

在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(1)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head == null || head.next == null){return head;}//定义一个假的节点。ListNode dummy=new ListNode(0);//假节点的next指向head。// dummy->1->2->3->4->5dummy.next=head;//初始化pre和end都指向dummy。pre指每次要翻转的链表的头结点的上一个节点。end指每次要翻转的链表的尾节点ListNode pre=dummy;ListNode end=dummy;while(end.next!=null){//循环k次,找到需要翻转的链表的结尾,这里每次循环要判断end是否等于空,因为如果为空,end.next会报空指针异常。//dummy->1->2->3->4->5 若k为2,循环2次,end指向2for(int i=0;i<k&&end != null;i++){end=end.next;}//如果end==null,即需要翻转的链表的节点数小于k,不执行翻转。if(end==null){break;}//先记录下end.next,方便后面链接链表ListNode next=end.next;//然后断开链表end.next=null;//记录下要翻转链表的头节点ListNode start=pre.next;//翻转链表,pre.next指向翻转后的链表。1->2 变成2->1。 dummy->2->1pre.next=reverse(start);//翻转后头节点变到最后。通过.next把断开的链表重新链接。start.next=next;//将pre换成下次要翻转的链表的头结点的上一个节点。即startpre=start;//翻转结束,将end置为下次要翻转的链表的头结点的上一个节点。即startend=start;}return dummy.next;}//链表翻转// 例子:   head: 1->2->3->4public ListNode reverse(ListNode head) {//单链表为空或只有一个节点,直接返回原单链表if (head == null || head.next == null){return head;}//前一个节点指针ListNode preNode = null;//当前节点指针ListNode curNode = head;//下一个节点指针ListNode nextNode = null;while (curNode != null){nextNode = curNode.next;//nextNode 指向下一个节点,保存当前节点后面的链表。curNode.next=preNode;//将当前节点next域指向前一个节点   null<-1<-2<-3<-4preNode = curNode;//preNode 指针向后移动。preNode指向当前节点。curNode = nextNode;//curNode指针向后移动。下一个节点变成当前节点}return preNode;}}
2. 递归

在这里插入图片描述在这里插入图片描述

    public ListNode reverseKGroup(ListNode head, int k) {if (head == null || head.next == null) {return head;}ListNode tail = head;for (int i = 0; i < k; i++) {//剩余数量小于k的话,则不需要反转。if (tail == null) {return head;}tail = tail.next;}// 反转前 k 个元素ListNode newHead = reverse(head, tail);//下一轮的开始的地方就是tailhead.next = reverseKGroup(tail, k);return newHead;}/*左闭又开区间*/private ListNode reverse(ListNode head, ListNode tail) {ListNode pre = null;ListNode next = null;while (head != tail) {next = head.next;head.next = pre;pre = head;head = next;}return pre;}

【总结】

1.链表题目多画图 ,画图大法好
2.整条链表翻转
    例子:   head: 1->2->3->4public ListNode reverse(ListNode head) {//单链表为空或只有一个节点,直接返回原单链表if (head == null || head.next == null){return head;}//前一个节点指针ListNode preNode = null;//当前节点指针ListNode curNode = head;//下一个节点指针ListNode nextNode = null;while (curNode != null){nextNode = curNode.next;//nextNode 指向下一个节点,保存当前节点后面的链表。curNode.next=preNode;//将当前节点next域指向前一个节点   null<-1<-2<-3<-4preNode = curNode;//preNode 指针向后移动。preNode指向当前节点。curNode = nextNode;//curNode指针向后移动。下一个节点变成当前节点}return preNode;}
3.常规解法

将链表指针全部复制到数组进行调整后再连接的算法

转载链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/tu-jie-kge-yi-zu-fan-zhuan-lian-biao-by-user7208t/

转载链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/di-gui-java-by-reedfan-2/

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

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

相关文章

2.jsp初识

目录 什么是jsp jsp的特点 早期的网站一般是用标准的HTML文件也 就是静态网页制作的&#xff0c;通常没有后台数据库、 不能和用户交互&#xff0c;内容更新起来相对也比较 麻烦&#xff0c;适用于一些不需要经常更新的展示型 网站。而动态网页上显示的内容不是固定的&#x…

武大计算机专业湖北录取分数线,武汉大学2020年本科一批分专业录取分数统计(湖北省)...

2020年高考已经过去&#xff0c;为给2021年的高考生们提供一些报考资料&#xff0c;我们将逐一推出一些重点大学在全国各省分专业的录取分数。本文先介绍武汉大学2020年在湖北省本科一批的录取情况。武汉大学始建于1893年&#xff0c;是国家教育部直属重点大学&#xff0c;国家…

[Leedcode][JAVA][第210 题][课程表 II][拓扑排序][BFS][DFS][有向图]

【问题描述】[第210 题][课程表 II][中等] 现在你总共有 n 门课需要选&#xff0c;记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如&#xff0c;想要学习课程 0 &#xff0c;你需要先完成课程 1 &#xff0c;我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的…

牛客小白月赛11 Rinne Loves Xor

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/I code: #include<bits/stdc.h> using namespace std; typedef unsigned long long ll; ll mod1e97; ll pow(ll x,ll n,ll mod) {ll res1;while(n>0){if(n%21){resres*x;resres%mod;}xx*x;xx%mod;n>&…

HDU - 2571 

穿过幽谷意味着离大魔王lemon已经无限接近了&#xff01; 可谁能想到&#xff0c;yifenfei在斩杀了一些虾兵蟹将后&#xff0c;却再次面临命运大迷宫的考验&#xff0c;这是魔王lemon设下的又一个机关。要知道&#xff0c;不论何人&#xff0c;若在迷宫中被困1小时以上&#xf…

3.JSP开发探秘

目录 1JSP工作原理 2JSP设计模式 3JSP开发方式 用户通过浏览器提交请求&#xff0c;服务器端收到请求后进行处理&#xff0c;再以HTML的形式把处理结果返 回给客户端&#xff0c;客户端通过浏览器查看得到的静态网页。 如果JSP程序是第一次被加载&#xff0c;会首先被编…

[Leedcode][JAVA][第152题][乘积最大子数组][动态规划]

【问题描述】[中等] 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2:输入:…

4.与JSP的第一次握手

做一个简单的JSP页面&#xff0c;并用浏览器运行。 打开NetBeans&#xff0c;创建Java Web项目 创建JSP文件 修改JSP文件 <h3>JSP技术带你进入动态网页时代&#xff01;</h3> <!--在JSP页面中进行变量声明--> <% String st"我将成为一名…

九歌计算机在线作诗硬件原理,“九歌”作诗是如何炼成的?

原标题&#xff1a;“九歌”作诗是如何炼成的&#xff1f;你有木有为研究数据的处理一筹莫展&#xff1f;你有木有为课题方法的突破绞尽脑汁&#xff1f;你有木有为完美的宣传文案纠结犯难&#xff1f;亲&#xff0c;是该来一杯清华学术咖啡&#xff0c;约会“信息达人”了&…

WEB_头等舱

题目链接&#xff1a;http://123.206.87.240:9009/hd.php 题解&#xff1a; 打开题目&#xff0c;什么也没有 查看网页源代码&#xff0c;真的什么也没有 于是采用burp进行抓包&#xff0c;burp工具下载链接&#xff1a;https://pan.baidu.com/s/1daOvlBo-pU2k9WYBN_5EQQ 右键&…

[Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

【问题描述】[中等] 根据一棵树的前序遍历与中序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。例如&#xff0c;给出前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a;3/ \9 20/ \15 7【解答思路】 1. 递归 先序…

登录页面实现

实现登录页面 打开NetBeans&#xff0c;创建Java Web项目 <hr><hr> <form name"" action "" method"post"> <table border"1"> <tr> <td>用户名&#xff1a;</td> …

html和css可以用在ssh里面么,在网站中使用SSH

嗨&#xff0c;我目前正在制作自己的软件来控制一个带有Raspberry Pi的机器人。我想知道是否可以将ssh嵌入到HTML代码中&#xff0c;因此当用户输入Pi的IP地址时&#xff0c;它将通过ssh连接到pi。在网站中使用SSH然后我想要做的是通过ssh发送命令&#xff0c;当他们点击一个按…

JSP环境简介

JSP环境简介 最低环境需求 JDK jdk的安装和配置

[Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]

【问题描述】[第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s&#xff0c;最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: "aba" 输出: True 示例 2:输入: "abca" 输出: True 解释: 你可以删除c字符。 注意:字符串只包含从 a-z 的小…

html:(2):制作第一个网页和html和css的关系

在<h1>和</h1>标签之间&#xff0c;输入Hello World 字符串。 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>制作我的第一个网页</title><…

随手练——洛谷-P1008 / P1618 三连击(暴力搜索)

1.普通版 第一眼看到这个题&#xff0c;我脑海里就是&#xff0c;“我们是不是在哪里见过~”&#xff0c;去年大一刚学C语言的时候写过一个类似的题目&#xff0c;写了九重循环。。。。就像这样&#xff08;在洛谷题解里看到一位兄台写的。。。。超长警告&#xff0c;慎重点开&…

Java基础知识面试题

Java基础知识面试题Java概述基础语法数据类型编码注释访问修饰符关键字 final this super static流程控制语句面向对象类和接口变量和方法内部类重写与重载对象相等判断值传递Java包IO流反射String相关包装类相关Java概述 JVM、JRE和JDK的关系 JVM Java Virtual Machine是Jav…

html:(3):认识html标签和标签的语法

让我们通过一个网页的学习&#xff0c;来对html标签有一个初步理解。平常大家说的上网就是浏览各种各式各样的网页&#xff0c;这些网页都是由html标签组成的。下面就是一个简单的网页。效果图如下&#xff1a; 我们来分析一下&#xff0c;这个网页由哪些html标签组成&#xff…

JPA-EntityManager.merge()

EntityManager#merge merge() 用于处理 Entity 的同步。即数据库的插入和更新操作 merge的几种情况 1. 若传入的是一个临时对象 package jpa.test;import com.jpa.entity.Customer; import org.junit.After; import org.junit.Before; import org.junit.Test;import javax.pers…