问题:

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For 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

官方难度:

Hard

翻译:

给定一个链表,将节点每k项倒序链接,并且返回头结点。如果剩余链表不足k项,保持原状不动。

算法必须使用恒定的空间,且不能只交换节点的数据,必须交换节点。

例子:

给定链表:1->2->3->4->5。

K=2,返回链表:2->1->4->3->5。

K=3,返回链表:3->2->1->4->5。

  1. 这是No.024(Swap Nodes in Pairs)的深入研究。
  2. 需要交换具体的节点,而不是节点存储的数据。
  3. 首先要确定链表的长度size和返回的第一个节点first。
  4. 维护上一个节点last和当前节点current。
  5. 根据入参k和链表长度size建立while循环,每次循环结束前size-k。
  6. 循环内部,先将待处理的节点,放入数组。
  7. 将last节点的next指向数组最后一个元素,然后倒序将数组中的节点的next指向数组上一个元素,最后将数组第一个元素节点next指向当前节点current。
  8. 更新上一个节点值last。
  9. 入参检查,第一个节点head为null,或k<2时,直接返回head。

解题代码(交换数据):

     // 交换数据
public static ListNode reverseKGroupVal(ListNode head, int k) {
if (head == null || k < 2) {
return head;
}
// 获取链表的长度
ListNode check = head;
int size = 0;
while (check != null) {
size++;
check = check.next;
}
ListNode current = head;
ListNode[] reverse = new ListNode[k];
while (size > k - 1) {
// 倒序的节点数组,同时将 current 指向下一次倒序的节点开始位置
for (int i = 0; i < k; i++) {
reverse[i] = current;
current = current.next;
}
// 交换至一半结束
for (int i = 0; i < (k >>> 1); i++) {
reverse[i].val = reverse[i].val + reverse[k - 1 - i].val - (reverse[k - 1 - i].val = reverse[i].val);
}
size -= k;
}
return head;
}

reverseKGroupVal

解题代码(交换节点):

     // 交换节点
public static ListNode reverseKGroup(ListNode head, int k) {
if (head == null || k < 2) {
return head;
}
// 获取链表的长度
ListNode check = head;
int size = 0;
while (check != null) {
size++;
check = check.next;
}
// 确定返回的头节点
ListNode first = head;
if (k <= size) {
for (int i = 1; i < k; i++) {
first = first.next;
}
}
// 当前节点和上一个节点
ListNode current = head;
ListNode last = new ListNode(0);
ListNode[] reverse = new ListNode[k];
while (size > k - 1) {
for (int i = 0; i < k; i++) {
reverse[i] = current;
current = current.next;
}
// 倒序赋值
last.next = reverse[k - 1];
for (int i = k - 1; i > 0; i--) {
reverse[i].next = reverse[i - 1];
}
reverse[0].next = current;
// 更新上一个节点
last = reverse[0];
size -= k;
}
return first;
}

reverseKGroup

相关链接:

https://leetcode.com/problems/reverse-nodes-in-k-group/

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/hard/Q025.java

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

No.025:Reverse Nodes in k-Group的更多相关文章

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

  2. Reverse Nodes In K Group,将链表每k个元素为一组进行反转---特例Swap Nodes in Pairs,成对儿反转

    问题描述:1->2->3->4,假设k=2进行反转,得到2->1->4->3:k=3进行反转,得到3->2->1->4 算法思想:基本操作就是链表 ...

  3. 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 ...

  4. LeetCode OJ:Reverse Nodes in k-Group(K个K个的分割节点)

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  5. LeetCode之“链表”:Reverse Nodes in k-Group

    题目链接 题目要求: Given a linked list, reverse the nodes of a linked list k at a time and return its modifi ...

  6. 每日算法之二十三: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. If ...

  7. LeetCode 025 Reverse Nodes in k-Group

    题目描述:Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time an ...

  8. 【Reverse Nodes in k-Group】cpp

    题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

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

随机推荐

  1. Hibernate 3.3.2 文档翻译 Day01

    Hibernate 3.3.2 文档翻译 翻译人:微冷的雨 第一次书写:2015年11月29日 本人呕心沥血之作,请细心阅读领悟! Day01-1.1 项目描述 微冷的雨翻译:例如,我们将要建立一个可 ...

  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能

    在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...

  3. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  4. iOS-常用的第三方框架的介绍

    写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...

  5. iOS-网络基础

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  6. [译]AngularJS sercies - 获取后端数据

    原文:ANGULARJS SERVICES – FETCHING SERVER DATA $http是AngularJS内置的服务,能帮助我们完成从服务端获数据.简单的用法就是在你需要数据的时候,发起 ...

  7. TortoiseSVN Clean up 失败的处理方法

    当使用 TortoiseSVN 下载项目失败之后,重新下载之前需要 Clean up,在 TortoiseSVN 中 Clean up 总是失败.   在命令行行中执行 svn cleanup 就成功 ...

  8. 前端学PHP之面向对象系列第五篇——对象操作

    × 目录 [1]对象克隆 [2]对象比较[3]对象串行化[4]json 前面的话 本文主要介绍面向对象中的一些对象操作 对象克隆 对象复制,又叫对象克隆,可以通过 clone 关键字来完成 在多数情况 ...

  9. 为 Neutron 准备物理基础设施(I) - 每天5分钟玩转 OpenStack(75)

    前面讨论了 Neutron 的架构和基础知识,接下来就要通过实验深入学习和实践了. 第一步就是准备实验用的物理环境,考虑如下几个问题: 需要几个节点? 如何分配节点的角色? 节点上部署哪些服务? 配几 ...

  10. jquery EasyUI的formatter格式化函数代码

    要格式化数据表格列,需要设置formatter属性,该属性是一个函数,它包含两个参数:  value: 对应字段的当前列的值  record: 当前行的记录数据  复制代码 代码如下: $('#tt' ...