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

题意:以k个结点为一组,进行反转连接,若最后小于k个结点,则保持不变。要求:仅用常数空间,不改变结点的值。

思路:大致过程是每k个结点一反转,直到剩余结点数小于k。遇到一个问题是:如何判断剩余结点数小于k,即循环的终止条件?这样就需要知道整条链表的总共的结点数count,然后每次反转完一组则用总的count减去k,直到最后剩余结点数小于k,就不用改变。遇到另一个问题,如何反转k个结点,这个和reverse linked list ii类似,大致的想法可以参照。这样就剩下的如何将不同的小组连接起来的问题,因为在reverse linked list ii这题中,只要反转一部分,所以其pre是不动的,这题因为有很多小组,所以pre应该是每k个结点为一小组的最开始结点的前驱,所以要移动,同理的是当前节点cur。因为要改变表头,所以要先new一个nList。使用计数器的思维值得注意。

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *reverseKGroup(ListNode *head, int k)
{
ListNode *nList=new ListNode(-);
nList->next=head;
ListNode *cur=head;
ListNode *pre=nList; int num=; //组里的结点数
int count=; //整链结点数
while(head)
{
head=head->next;
count++;
} while(count>=k) //整体遍历
{
while(++num<k) //组内循环
{
ListNode *temp=cur->next;
cur->next=temp->next;
temp->next=pre->next;
pre->next=temp;
}
count-=num;  //减k也行.
num=;
pre=cur; //每组反转以后,pre要移动
cur=cur->next; //cur要变
}
return nList->next; }
};

还有另一种写法:见Code Gander的博客,其核心思想是,每次取k个结点进行反转,传入反转函数的是这个组的前驱和其最后一个结点,反转函数返回是反转后小组的第一个结点,体会其中的差别。代码如下:

 /**   Reverse Nodes in k-Group
*
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/ //经典,很多关于list的题都可用这种方法重写
/* 使用计数器count,若count=k,则反转前k个节点,然后重置count */
class Solution {
public:
ListNode *reverseKGroup(ListNode *head, int k)
{
if(head==NULL) return NULL; ListNode *preAll=new ListNode(-);
preAll->next=head; ListNode *pre=preAll;
ListNode *cur=head;
int count=; while(cur !=NULL)
{
count++;
ListNode *last=cur->next;
if(count==k)
{
pre=reverse(pre,last);
count=;
}
cur=last;
} return preAll->next;
} //反转前k个节点,这k个点的前驱和最后一点传入
ListNode *reverse(ListNode *pre,ListNode *last)
{
if(pre==NULL||pre->next==NULL) return pre; ListNode *head=pre->next;
ListNode *cur=pre->next->next; while(cur !=last)
{
ListNode *temp=cur->next;
cur->next=pre->next;
pre->next=cur;
cur=temp;
} head->next=last;
return head; //巧妙之处是返回前节点
}
};

[Leetcode] Reverse nodes in k group 每k个一组反转链表的更多相关文章

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

  5. LeetCode Reverse Nodes in k-Group 每k个节点为一组,反置链表

    题意:给一个单链表,每k个节点就将这k个节点反置,若节点数不是k的倍数,则后面不够k个的这一小段链表不必反置. 思路:递归法.每次递归就将k个节点反置,将k个之后的链表头递归下去解决.利用原来的函数接 ...

  6. LeetCode: 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 and ret ...

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

  8. leetcode Reverse Nodes in k-Group python

    # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...

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

随机推荐

  1. (数据科学学习手札09)系统聚类算法Python与R的比较

    上一篇笔者以自己编写代码的方式实现了重心法下的系统聚类(又称层次聚类)算法,通过与Scipy和R中各自自带的系统聚类方法进行比较,显然这些权威的快捷方法更为高效,那么本篇就系统地介绍一下Python与 ...

  2. HDU1209:Clock

    参考:https://blog.csdn.net/libin56842/article/details/8990530 https://blog.csdn.net/u011479875/article ...

  3. YSZOJ:#247. [福利]可持久化线段树 (最适合可持久化线段树入门)

    题目链接:https://syzoj.com/problem/247 解题心得: 可持久化线段树其实就是一个线段树功能的加强版,加强在哪里呢?那就是如果一颗普通的线段树多次修改之后还能知道最开始的线段 ...

  4. loj136 (最小瓶颈路,多次询问)

    题目描述 给定一个包含 n nn 个节点和 m mm 条边的图,每条边有一个权值.你的任务是回答 k kk 个询问,每个询问包含两个正整数 s ss 和 t tt 表示起点和终点,要求寻找从 s ss ...

  5. python2.7入门---网络编程(socket)

        Python 提供了两个级别访问的网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别 ...

  6. Java:Random函数及其种子的作用

    伪随机(preundorandom):通过算法产生的随机数都是伪随机!! 只有通过真实的随机事件产生的随机数才是真随机!!比如,通过机器的硬件噪声产生随机数.通过大气噪声产生随机数 Random生成的 ...

  7. LeetCode:7. Reverse Integer(Easy)

    题目要求:将给出的整数进行逆序输出 注意:整数的最大范围-2147483648-2147483647,当翻转后的数超出范围后返回0 思路:对给出的整数除以10,取余和取整:然后对取整部分继续取余和取整 ...

  8. C# String函数

    public static bool IsNullOrEmpty(string value) 如果 true 参数为 value 或空字符串 (""),则为 null:否则为 fa ...

  9. 导入execl到数据库mysql

    GwykhrenyuankuList <body jwcid="$content$"> <span jwcid="@components/AppBord ...

  10. 从循环里面用QPixmap new对象很耗时联想到的

    1.在循环里面用QPixmap new图片对象延迟很高,这个是通过打时间日志得出的,深层原因还不清楚: 2.自制的图片浏览器在初始化的时候会初始化自己的一个图片列表,所以要用到上面的描述.所有图片的初 ...