将链表以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- ...
随机推荐
- 深入浅出eBPF|你要了解的7个核心问题
简介: 过去一年,ARMS基于eBPF技术打造了Kubernetes监控,提供多语言无侵入的应用性能,系统性能,网络性能观测能力,验证了eBPF技术的有效性.eBPF技术和生态发展很好,未来前景广大, ...
- 解决方案|致拓T8数字化ERP
简介:通过快速构建敏捷ERP系统,实现从销售到财务的全流程闭环管理,助力企业数字化升级. 「致拓T8数字化ERP」解决方案聚焦业财一体,助力企业卓有成效地提升经营收益,赋能企业个性化数字生产管理.本 ...
- Kubernetes 稳定性保障手册:洞察+预案
简介: 稳定性保障是个复杂的话题,需要有效.可迭代.可持续保障集群的稳定性,系统性的方法或许可以解决该问题. 作者 | 悟鹏来源 | 阿里巴巴云原生公众号 <Kubernetes 稳定性保障手册 ...
- [FAQ] ErrorException of l5-swagger:generate, Required @OA\Info() not found
l5-swagger 除了要添加 @OA\Get() 针对方法的注释之外,每个 Controller 还需要一个概述信息,如下: /** * @OA\Info( * title="Auth ...
- Fiddler 将插件放在独立子文件夹
我的 Fiddler 安装了许多插件,有一些插件存在 DLL 名冲突问题,比如多个不同的插件都存在名为 PluginCore.dll 但实际实现逻辑完全不相同的程序集.这就导致了多个插件的安装之间,如 ...
- PostMan测试图片上传接口的方法
一.选择POST后添加接口地址 二.选择Body下的from-data 注:Headers不要加参数 三.填写key,再key后的下拉选择file,然后选择文件 注:key并不是图片名称,而是接口接收 ...
- Oracle和达梦:相似度函数:UTL_MATCH
UTL_MATCH介绍: Oracle的UTL_MATCH包是一个提供字符串匹配和相似度计算功能的工具包.它包含了一系列函数,用于执行字符串比较.相似度计算和模式匹配等操作. UTL_MATCH包中的 ...
- Java数字转中文数字——支持:Integer、BigDecimal
1.效果 public static void main(String[] args) { System.out.println(int2chineseNum(3456)); System.out.p ...
- 关于Web的欢迎页面的开发设置
关于Web的欢迎页面的开发设置 每博一文案 命运总是不如人愿.但往往是在无数的痛苦中,在重重的矛盾和艰辛中,才是人成熟起来. 一次邂逅,一次目光的交融,就是永远的合二为一,就是与上帝的契约:总是风暴雷 ...
- 一个现代化轻量级的跨平台Redis桌面客户端
大家好,我是 Java陈序员. Redis 作为一款高性能的非关系型数据库,可是深受开发者的喜爱,无论是什么开发,都能看到 Redis 的身影. 今天,给大家介绍一款跨平台的 Redis 客户端连接工 ...