一群友分享的阿里面试题

 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长度为一组反转链表的更多相关文章

  1. 如何k个一组反转链表

    之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决. 本文要解决「K 个一组反转链表」,不 ...

  2. [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 ...

  3. 【C++】“反转链表”相关的题目

    1.反转链表:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. (1)这道题是经典的题目了,用迭代的方式解决也是很容易的,代码量也不大.分享一个我个人做题的方式,我会先在题目开 ...

  4. LeetCoded第25题题解--K个一组翻转链表--java--链表

    链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素的引用字段链接在一起. 双链表:与单链表不同的是,双链表的每个节点都含有两个引用字段. 链表优点 灵活分配内存空间 能在O ...

  5. 【剑指offer】反转链表,C++实现(链表)

    1.题目 输入一个链表的头结点,首先反转链表后,然后输出链表的所有元素(牛客网). struct ListNode { int val; struct ListNode *next; }; 2.思路 ...

  6. 【剑指Offer】【链表】合并两个排序的链表

    题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. A:若链表1为空,则合并后的链表头结点为pHead2:若链表2为空,则合并后的链表头结点为pHead ...

  7. 单链表每k个节点一组进行反转(最后不足k个也反转)

    一道面试题,第一次碰到这道题的时候 要求10分钟之内手写代码实现,当时没写出来,后来花点时间把过程梳理一遍,也挺简单的....... 思路就是在原来单链表反转的基础上,加几个控制参数,记录几个关键节点 ...

  8. 25. k个一组翻转链表

    题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定 ...

  9. C++课堂作业二之反转链表

    1问题链接: https://www.patest.cn/contests/pat-b-practise/1025 2解题想法: 这题原来用数组打过,现在是想保留暂存数据的数组,然后按顺序提取出来到创 ...

  10. #leetcode刷题之路25- k个一组翻转链表

    给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 :给定这个链表:1- ...

随机推荐

  1. Flink CDC 2.0 正式发布,详解核心改进

    简介: 本文由社区志愿者陈政羽整理,内容来源自阿里巴巴高级开发工程师徐榜江 (雪尽) 7 月 10 日在北京站 Flink Meetup 分享的<详解 Flink-CDC>.深入讲解了最新 ...

  2. [Go] VsCode 的 Golang 环境设置与代码跳转支持

      终端执行: go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.io,direct WIndows下自定义指定 GOPATH 路径 ...

  3. [MySQL] 原生全文检索 fulltext 的简单应用

    在目标字段上添加全文检索:alter table 表名 add fulltext(字段) with parser ngram 查询语句:select * from xxx where match(字段 ...

  4. CSS属性继承问题,那些会被继承,哪些不继承?

    总的来能被继承的就是三大类 一,字体有关的的,font-开头的 二,文本有关的,text- 开头的 三,visibility , cursor 其它的基本都是不能被继承 比如说这个,你以为它继承了ma ...

  5. B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能

    B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能 @ 目录 B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa ...

  6. 由初中生实现的 Windows 12 网页版!

    大家好,我是 Java陈序员. 这几天,逛 Github 的时候,看到了一个项目 win12 -- 仿 Windows12 网页版!被它实现的页面功能震撼到了,大家可以一起来感受下! 首先是登录页面. ...

  7. C++ 构造函数和析构函数(Constructors & Destructors)

    一.定义: 当object产生,有一个特殊的称为constructor的函数会自动执行.当object死亡,有一个特殊的称为destructor的函数会自动执行.Constructor 可以不只一个, ...

  8. 谷歌 hackbar 不能使用的问题

    谷歌 hackbar 不能使用的问题 下载 hackbar 插件:https://github.com/Mr-xn/hackbar2.1.3 解压文件,将其拖入 chrome 扩展程序中 点击详情,点 ...

  9. 在线自动加字幕!超快完成Pr的字幕制作!

    在线自动加字幕!超快完成Pr的字幕制作! https://www.bilibili.com/video/BV1T441167eX/?spm_id_from=333.788.videocard.3 ht ...

  10. LogAgen的工作流程

    LogAgen的工作流程: 一.读日志 --tailf 第三方库 新建tail_test/main.go package main import ( "fmt" "git ...