将链表以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- ...
随机推荐
- SAE助力「海底小纵队学英语」全面拥抱Serverless,节省25%以上成本
简介: 阿里云Serveless应用引擎SAE 具备免运维IaaS.按需使用.按量计费.低门槛服务应用上云,并且支持多种语言和高弹性能力等特点,刚好完美解决了客户长期以来运维复杂.资源利用率不高.开发 ...
- 解决 Serverless 落地困难的关键,是给开发者足够的“安全感”
简介:越来越多的云产品都会向全托管.Serverless 形态演进.当云的产品体系 Serverless 化达到一个临界值,通过函数计算这样的 Serverless 计算服务结合其他 Serverl ...
- JVM性能提升50%,聊一聊背后的秘密武器Alibaba Dragonwell
简介: 你要知道的关于Alibaba Dragonwell一些重要优化措施. 今年四月五日,阿里云开放了新一代ECS实例的邀测[1],Alibaba Dragonwell也在新ECS上进行了极致 ...
- LlamaIndex 起步教程(本地模型)
提示:确保您已先按照自定义安装步骤操作. 这是一个著名的"五行代码"起步示例,使用本地 LLM(大语言模型)和嵌入模型.我们将使用 BAAI/bge-small-en-v1.5 作 ...
- [Contract] Solidity 合约发布到测试网 ropsten 的作用
当我们本地完成了一系列测试以后,接下来就是准备上线了. 关于合约部署可以参考这篇:Solidity 合约使用 truffle 部署到测试网和主网 你可能有一个疑问,在上主网之前,先上测试网的作用是什么 ...
- WPF 已知问题 清空 CollectionView 的 SortDescriptions 可能抛出空异常
本文记录一个 WPF 的已知问题,在通过 CollectionViewSource 获取到 CollectionView 之后,如果 CollectionViewSource 对象已被 GC 回收,将 ...
- 兼容ie8问题
<!-- 让IE8/9支持媒体查询,从而兼容栅格 --><!--[if lt IE 9]><script src="https://cdn.staticfile ...
- 羽夏看Linux内核——简述
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- Wordpress给每一个分类栏目定制不同的广告位
给分类栏目添加广告位,等同于添加自定义字段. 如果需要依据不同的栏目给广告位添加不同的tag来源,需要在模板页面中获取栏目的分类别名,读取不同的广告. 图1 如图1所示添加新的图片输入框 1. 实现的 ...
- 让AnaTraf成为您网络流量分析的最佳利器
在快速发展的数字时代,企业对网络性能的监测与分析需求愈加旺盛.作为网络性能监测与诊断(NPMD)领域的佼佼者,AnaTraf网络流量分析仪凭借其出色的性能和易用性,正成为网络管理人员的首选工具. An ...