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.

Have you met this question in a real interview?

Yes
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

LeetCode上的原题,请参见我之前的博客Reverse Nodes in k-Group 每k个一组翻转链表

解法一:

  1. class Solution {
  2. public:
  3. /**
  4. * @param head a ListNode
  5. * @param k an integer
  6. * @return a ListNode
  7. */
  8. ListNode *reverseKGroup(ListNode *head, int k) {
  9. ListNode *dummy = new ListNode(-), *pre = dummy, *cur = pre;
  10. dummy->next = head;
  11. while (cur->next) {
  12. int d = k;
  13. while (cur->next && d-- > ) {
  14. cur = cur->next;
  15. }
  16. if (d > ) return dummy->next;
  17. ListNode *t = cur->next;
  18. cur->next = NULL;
  19. pre->next = reverse(pre->next);
  20. for (int i = ; i < k; ++i) pre = pre->next;
  21. pre->next = t;
  22. cur = pre;
  23. }
  24. return dummy->next;
  25. }
  26. ListNode* reverse(ListNode *head) {
  27. ListNode *dummy = new ListNode(-), *cur = head;
  28. dummy->next = head;
  29. while (cur && cur->next) {
  30. ListNode *t = cur->next;
  31. cur->next = t->next;
  32. t->next = dummy->next;
  33. dummy->next = t;
  34. }
  35. return dummy->next;
  36. }
  37. };

解法二:

  1. class Solution {
  2. public:
  3. /**
  4. * @param head a ListNode
  5. * @param k an integer
  6. * @return a ListNode
  7. */
  8. ListNode *reverseKGroup(ListNode *head, int k) {
  9. ListNode *dummy = new ListNode(-), *pre = dummy, *cur = pre;
  10. dummy->next = head;
  11. int num = ;
  12. while (cur = cur->next) ++num;
  13. while (num >= k) {
  14. cur = pre->next;
  15. for (int i = ; i < k; ++i) {
  16. ListNode *t = cur->next;
  17. cur->next = t->next;
  18. t->next = pre->next;
  19. pre->next = t;
  20. }
  21. pre = cur;
  22. num -= k;
  23. }
  24. return dummy->next;
  25. }
  26. };

解法三:

  1. class Solution {
  2. public:
  3. /**
  4. * @param head a ListNode
  5. * @param k an integer
  6. * @return a ListNode
  7. */
  8. ListNode *reverseKGroup(ListNode *head, int k) {
  9. ListNode *cur = head;
  10. for (int i = ; i < k; ++i) {
  11. if (!cur) return head;
  12. cur = cur->next;
  13. }
  14. ListNode *new_head = reverse(head, cur);
  15. head->next = reverseKGroup(cur, k);
  16. return new_head;
  17. }
  18. ListNode* reverse(ListNode* head, ListNode* tail) {
  19. ListNode *pre = tail;
  20. while (head != tail) {
  21. ListNode *t = head->next;
  22. head->next = pre;
  23. pre = head;
  24. head = t;
  25. }
  26. return pre;
  27. }
  28. };

[LintCode] Reverse Nodes in k-Group 每k个一组翻转链表的更多相关文章

  1. leetcode 25. K 个一组翻转链表

    # coding:utf-8 __author__ = "sn" """ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返 ...

  2. LeetCode 25. K 个一组翻转链表 | Python

    25. K 个一组翻转链表 题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 题目 给你一个链表,每 k 个节点一组进行翻转 ...

  3. Java实现 LeetCode 25 K个一组翻转链表

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

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

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

  5. leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表

    24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...

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

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

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

  9. [Swift]LeetCode25. k个一组翻转链表 | 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. k  ...

随机推荐

  1. VS2010 打开 VS2012 的项目

    用 VS2010 打开 VS2012 项目,只需两步. 1. 修改解决方案文件(*.sln) 使用记事本打开 *.sln 文件,将里面的 Microsoft Visual Studio Solutio ...

  2. linux常用命令和选项

    (1)比较两个文件. diff filename1 filename2 -y -W number; -y 并列格式输出 -W 并列格式输出时指定的列宽 (2)linux下抓包 tcpdump有三类关键 ...

  3. 【MongoDB】2.可视化工具的安装和使用

    首先:关于  能支持MongoDB新版本的可视化工具,争议不断,各人都有各人的支持. 因此之前选择安装的时候就安装了MongoDB  3.0.14版本的. 最终,确定使用Robomongo作为我第一个 ...

  4. 587A

    #include<iostream> #include<algorithm> #include<stdio.h> #include<stdlib.h> ...

  5. mybatis 加载配置文件的两种方式

    package com.atguigu.day03_mybaits.test; import java.io.IOException;import java.io.InputStream;import ...

  6. background为圆角的表框,dp转Px,Px转dp

    圆角边框<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="ht ...

  7. Android 编程下 DP、SP 以及屏幕像素密度

    有时需为视图属性指定大小尺寸值(通常以像素为单位,但有时也用点.毫米或英寸).最常见的属性有: 文字大小(Text Size),指设备上显示的文字像素高度: 边距(Margin),指定视图组件间的距离 ...

  8. Herding

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  9. virtualtree 的使用(Delphi)

    VirtualTreeview的强大,毋庸置疑,不过,你能给演示演示,也不错,就是刚下来,只有一个可执行程序,感觉像病毒. 最近比较忙,没有上网,现在把我研究的结果和大家通报下,方便新手学习,避免走弯 ...

  10. 矩阵快速幂 UVA 10870 Recurrences

    题目传送门 题意:f(n) = a1f(n − 1) + a2f(n − 2) + a3f(n − 3) + . . . + adf(n − d), for n > d,求f (n) % m.训 ...