【LeetCode每日一题】25. Reverse Nodes in k-Group
时间:2022-07-22
本文章向大家介绍【LeetCode每日一题】25. Reverse Nodes in k-Group,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
Note:
- Only constant extra memory is allowed.
- You may not alter the values in the list’s nodes, only nodes itself may be changed.
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
题解
题目要求每k个节点一组进行翻转,返回反转后的链表。可以将算法分为两部分:分组+链表翻转;还要注意的是,如果剩余节点数目不够k个,不进行翻转,直接链接到上一组的链表上。
步骤:
- 记录链表长度;
- 循环,条件是剩余链表长度不小于k
- 一边计数一边翻转:
- 使用指针pre表示上一次翻转结果的链表尾,如果还没有进行翻转,设置为新声明的dummy节点;
- 指针cur表示需要翻转的节点;初始设置为pre指针的下一个节点;
- 进行翻转:
- 声明temp指针:记录cur的下一个节点
- 进行单节点的翻转;
- pre指针的下一个节点始终表示当前组翻转的头结点,所以每次反转后都要更新pre的next指针;
- 更新pre指针为cur;(cur指针指向当前组的最后一个节点)
- 更新链表长度k;
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode *first = new ListNode(-1), *pre = first, *cur = first;
first->next = head;
int len = 0;
// 记录链表长度
while (cur = cur->next) ++len;
// 训练分组反转链表
while (len >= k){
//记录需要翻转链表的起始节点
cur = pre->next;
//依次翻转,对组内的k个节点翻转
for (int i=1; i< k; ++i){
ListNode *temp = cur->next;
cur->next = temp->next;
temp->next = pre->next;
pre->next = temp;
}
pre = cur;
len -= k;
}
return first->next;
}
};
没有想到这里的翻转方式;想到的是先找到k个节点的子链表;然后翻转,最后更新链接指针;这种方法应该也可以,过两天回顾时再看看。
Reference
https://www.cnblogs.com/grandyang/p/4441324.html
- 超值干货:个人开发者如何使用免费又简单的开发后台
- 【周末分享】解决中文排版错位的JustifiedTextview控件
- 超级网络
- c++ fstream + string 处理大数据
- 超炫的FlowingDrawer效果
- 源码分享:仿余额宝数字跳动效果 TextCounter
- 一键清理应用数据或者清除应用缓存的方法
- 开发者必知:谷歌做了一个艰难的决定
- React编程思想
- 基于 React + Webpack 的音乐相册项目(下)
- Python中Keras深度学习库的回归教程
- Apache Spark 1.1中的统计功能
- 一次关闭所有Activity和连续点击两次返回键关闭程序的方法
- 解决TextView排版混乱或者自动换行的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringBoot 整合 SpringDataRedis
- SpringDataRedis 基本使用
- Spring Security 基础入门
- Spring Security 安全认证
- Spring Security 自定义登录页
- CAS 服务端部署
- Spring Security 权限控制
- vue动态组件的用法
- elementUI中checekBox实现全选和反选以及实现在input中输入空格出现label分割
- centos 安装git
- centos 挂载硬盘
- centos 安装postgrep
- springboot集成PowerJob-openAPI和回调完整流程
- 使用 Redisson 实现的 redis 分布式锁在 SpringBoot 中的简单使用
- SpringBoot 的过滤器 Filter 配置