将链表以m长度为一组反转链表
一群友分享的阿里面试题
1.将head链表以m为组反转链表(不足m则不反转):
例子:假设m=3. 链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 ->8
output: 3 -> 2 -> 1 ->6 ->5 ->4 -> 7 ->8
解法一:使用JDK的链表LinkedList
没有体现出链表的链式处理方式
代码
public static void main(String[] args) {
Integer[] array = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8};
LinkedList<Integer> linkedList = new LinkedList();
linkedList.addAll(Arrays.asList(array));
int m = 3;
System.out.println("当 m = " + m);
System.out.println("before handler");
for (Integer integer : linkedList) {
System.out.print(integer + " ");
}
System.out.println();
//核心代码处
for (int i = 0; i < linkedList.size(); i++) {
if (i % m == m - 1) {
int start = i - m + 1;
int end = i;
for (int a = 0; a < m / 2; a++) {
Integer temp = linkedList.get(start + a);
linkedList.set(start + a, linkedList.get(end - a));
linkedList.set(end - a, temp);
}
}
}
System.out.println("after handler");
for (Integer integer : linkedList) {
System.out.print(integer + " ");
}
}
运行效果:
当 m = 3
before handler
1 2 3 4 5 6 7 8
after handler
3 2 1 6 5 4 7 8
解法二:自己构造链表,用链的方式遍历处理链表
创建链表作为一个类使用
class Node<T> {
T value;
Node<T> next;
}
遍历链表
public static <T> void printLink(Node<T> head) {
Node<T> node = head;
while (node != null) {
System.out.print(node.value + " ");
node = node.next;
}
System.out.println();
}
将数组转换成链表,并返回链表head
/**
* 将数组转成链表
*
* @param array
* @param T类型的数组
* @return Node<T>类型的链表head
*/
public static <T> Node<T> arrayToNodeList(T[] array) {
Node<T> node = new Node<T>();
Node<T> head = node;
for (T object : array) {
Node<T> temp = new Node<T>();
temp.value = object;
node.next = temp;
node = temp;
}
head = head.next;
return head;
}
递归分组反转链表
/**
* @param head 需要反转的头结点,
* @param m 以m为一组反转
* @return 返回以m为一组反转完成的链表
*/
public static <T>Node<T> linkReverse(Node<T> head, int m) {
if (head == null || head.next == null) {
return head;
}
int count = 0;
Node<T> current = head;
while (count != m && current != null) {
current = current.next;
count++;
}
if (count == m) {
current = linkReverse(current, m);
while (count-- > 0) {
Node<T> temp = head.next;
head.next = current;
current = head;
head = temp;
}
head = current;
}
return head;
}
实例测试
public static void main(String[] args) {
Integer[] array = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8};
//构造单向链表
Node<Integer> head = arrayToNodeList(array);
System.out.println("before handler");
printLink(head);
System.out.println("after handler");
printLink(linkReverse(head, 3));
}
结果输出
before handler
1 2 3 4 5 6 7 8
after handler
3 2 1 6 5 4 7 8
将链表以m长度为一组反转链表的更多相关文章
- 如何k个一组反转链表
之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决. 本文要解决「K 个一组反转链表」,不 ...
- [Leetcode] Reverse nodes in k group 每k个一组反转链表
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
- 【C++】“反转链表”相关的题目
1.反转链表:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. (1)这道题是经典的题目了,用迭代的方式解决也是很容易的,代码量也不大.分享一个我个人做题的方式,我会先在题目开 ...
- LeetCoded第25题题解--K个一组翻转链表--java--链表
链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素的引用字段链接在一起. 双链表:与单链表不同的是,双链表的每个节点都含有两个引用字段. 链表优点 灵活分配内存空间 能在O ...
- 【剑指offer】反转链表,C++实现(链表)
1.题目 输入一个链表的头结点,首先反转链表后,然后输出链表的所有元素(牛客网). struct ListNode { int val; struct ListNode *next; }; 2.思路 ...
- 【剑指Offer】【链表】合并两个排序的链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. A:若链表1为空,则合并后的链表头结点为pHead2:若链表2为空,则合并后的链表头结点为pHead ...
- 单链表每k个节点一组进行反转(最后不足k个也反转)
一道面试题,第一次碰到这道题的时候 要求10分钟之内手写代码实现,当时没写出来,后来花点时间把过程梳理一遍,也挺简单的....... 思路就是在原来单链表反转的基础上,加几个控制参数,记录几个关键节点 ...
- 25. k个一组翻转链表
题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定 ...
- C++课堂作业二之反转链表
1问题链接: https://www.patest.cn/contests/pat-b-practise/1025 2解题想法: 这题原来用数组打过,现在是想保留暂存数据的数组,然后按顺序提取出来到创 ...
- #leetcode刷题之路25- k个一组翻转链表
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 :给定这个链表:1- ...
随机推荐
- Elastic与阿里云助力汽车及出行产业数字化转型
简介:目前,阿里云和Elastic在全国已经有很多的项目正在开展合作,而在移动出行领域与享道出行的合作案例,则是代表性的. 在汽车产业变革逐步深入的当下,云计算.大数据等信息技术成为了汽车企业经历数 ...
- 如何 0 改造,让单体/微服务应用成为 Serverless Application
简介: 随着 2013 年以 Docker 为代表的容器技术.CNCF 基金会以及 K8s 的发展等,云原生开始被广大开发者所熟知.云原生时代之前还有两个阶段:一是自建 IDC 机房,二是简单地把原有 ...
- Apache Flink在 bilibili 的多元化探索与实践
简介: bilibili 万亿级传输分发架构的落地,以及 AI 领域如何基于 Flink 打造一套完善的预处理实时 Pipeline. 本文由 bilibili 大数据实时平台负责人郑志升分享,本次分 ...
- dotnet 6 引用 NAudio 的旧版本构建不通过
本文告诉大家在使用 NAudio 的旧版本导致构建不通过问题,解决方法是升级到 1.10 或以上版本 在更新 dotnet 6 项目时,使用了 NAudio 的旧版本,构建失败,提示 MC1000 如 ...
- 9.按需创建PV和PVC并使用
官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-stor ...
- SAP集成技术(十)混合集成平台
混合集成平台hybrid integration platform (有时缩写为HIP)这个术语近年来被大量使用,但很多人可能不太清楚它的概念. 内容摘录自<SAP Interface Mana ...
- R4_Elasticsearch Mapping parameters
Elasticsearch的Mapping,定义了索引的结构,类似于关系型数据库的Schema. Mapping Type:每个索引都拥有唯一的 mapping type,用来决定文档将如何被索引.从 ...
- ITIL4 服务价值系统(SVS):一场服务管理的革新之旅
在这个数字化时代,每一家企业都在追求高效的服务管理和卓越的客户体验.今天,我们就来聊一聊ITIL4中的服务价值系统(Service Value System, SVS)--一个让服务管理变得更加直观和 ...
- google账户配置foxmail和使用foxmail
最近想把邮件分门别类,创建一些个人文件夹,更好的筛选邮件,可以尝试使用foxmail 1. 如果你有google账户,在配置foxmail之前需打开google账户的安全设置 https://myac ...
- 若依报错:登录状态已过期,您可以继续留在该页面,或者重新登录;When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.
报错界面 后台报错 java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot c ...