问题:

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. 小型文件数据库 (a file database for small apps) SharpFileDB

    小型文件数据库 (a file database for small apps) SharpFileDB For english version of this article, please cli ...

  2. iOS-即时通讯-环信

    下载地址:http://www.easemob.com/downloads SDK目录讲解 1.从官网下载下来的包分为如下四部分: 环信iOS SDK 开发使用 环信iOS release note ...

  3. Linux核心源码阅读方法

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

  4. 12款非常精致的免费 HTML5 & CSS3 网站模板

    01. Joefrey Mahusay 很炫的单页网站模板,基于 HTML5 & CSS3 制作,适合用于设计师个人简历.摄影师和平面设计师的个人作品展示. 演示  下载 02. Folder ...

  5. OpenCASCADE Color Scale

    OpenCASCADE Color Scale eryar@163.com Abstract. The color scale is a specialized label object that d ...

  6. 深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器

    × 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 本文是子元素选择器的续篇,主要介绍关于nth-of-type()选择器的内容.该部分内容并非没有出现在<锋利的 ...

  7. [c++] constexpr and literal class

    稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++?   2. int i; // not constant const ...

  8. 关于一道数据库例题的解析。为什么σ age>22 (πS_ID,SCORE (SC) ) 选项是错的?

    本人大二学子.近段时间在做数据库复习题的时候遇到一道题,如下. 有关系SC(S_ID,C_ID,AGE,SCORE),查找年龄大于22岁的学生的学号和分数,正确的关系代数表达式是( ) . ⅰ. πS ...

  9. GCD-两个网络请求同步问题

    在网络请求的时候有时有这种需求 两个接口请求数据,然后我们才能做最后的数据处理.但是因为网络请求是移步的 .我们并不知道什么时候两个请求完成 . 通常面对这样的需求会自然的想到 多线程 啊 .表现真正 ...

  10. git diff ^M的消除

    这是由于换行符在不同的操作系统上定义的区别造成的. Windows用CR LF来定义换行,Linux用LF. CR全称是Carriage Return ,或者表示为\r, 意思是回车. LF全称是Li ...