问题:

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. JS.中文乱码,Jsp\Servlet端的解决办法

    JS.中文乱码,Jsp\Servlet端的解决办法 2010-03-08 15:18:21|  分类: Extjs |  标签:encodeuricomponent  乱码  urldecoder   ...

  2. MongoDB 之C#实践

    官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads.下载后,还提供了一个酷似msdn的帮助文档. samus驱动:https:/ ...

  3. Linux核心源码阅读方法

    首次阅读Linux4.0.5内核源代码时,一脸茫然,它的代码不仅复杂,而且庞大,找不到从哪里开始阅读. 通常Linux会有以下目录 arch 子目录包括所有和体系结构相关的核心代码.它还有更深的子目录 ...

  4. SQL Server 维护计划实现数据库备份(策略实战)

    一.背景 之前写过一篇关于备份的文章:SQL Server 维护计划实现数据库备份,上面文章使用完整备份和差异备份基本上能解决数据库备份的问题,但是为了保障数据更加安全,我们需要再次完善我们的备份计划 ...

  5. UML基础系列:类图

    类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...

  6. Dnsmasq安装与配置

    默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...

  7. 在浏览器中输入URL按下回车键后发生了什么

    在浏览器中输入URL按下回车键后发生了什么 [1]解析URL[2]DNS查询,解析域名,将域名解析为IP地址[3]ARP广播,根据IP地址来解析MAC地址[4]分别从应用层到传输层.网络层和数据链路层 ...

  8. 虚拟 ​router 原理分析- 每天5分钟玩转 OpenStack(101)

    上一节我们创建了虚拟路由器"router_100_101",并通过 ping 验证了 vlan100 和 vlan101 已经连通. 本节将重点分析其中的原理. 首先我们查看控制节 ...

  9. 5分钟用Spring4 搭建一个REST WebService

    前置技能 ① 使用maven来管理java项目 这个技能必须点一级,以便快速配置项目. 本文实际上是我学习Spring的过程中搬的官网上的demo,使用maven配置项目. ② jdk 1.8+   ...

  10. Objective-C中的Block(闭包)

    学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也 ...