LeetCode(25)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 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

分析

该题目核心是分组对一个链表进行反转,链接,如示例所示。

AC代码

/**
 * 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 *p = head;
        int len = 0;
        while (p)
        {
            len++;
            p = p->next;
        }
        if (len < k || k == 1)
            return head;

        vector<ListNode *> vl;
        ListNode *h = head;

        while (len >= k)
        {
            //找到len/k个子链表,分别翻转
            ListNode *q = h;
            for (int i = 1; i < k; i++)
                q = q->next;

            //保存后续结点
            ListNode *r = q->next;

            q->next = NULL;

            vl.push_back(reverse(h));

            h = r;
            len -= k;
        }//while

        //将翻转的链表链接起来,保存剩余的小于k个的结点
        ListNode *re = h;
        if (vl.size() != 1)
        {

            for (int i = 0; i < vl.size() - 1; i++)
            {
                p = LastNode(vl[i]);
                p->next = vl[i + 1];
            }//for
            p->next = vl[vl.size() - 1];
        }

        LastNode(vl[vl.size() - 1])->next = re;

        head = vl[0];
        return head;

    }

    ListNode *LastNode(ListNode *head)
    {
        while (head && head->next)
            head = head->next;
        return head;
    }

    ListNode* reverse(ListNode* head)
    {
        if (head == NULL || head->next == NULL)
            return head;

        ListNode *ret = head , *p = head->next;
        ret->next = NULL;

        while (p)
        {
            //保存下一个结点
            ListNode *q = p->next;

            p->next = ret;
            ret = p;
            p = q;
        }
        return ret;
    }
};

GitHub测试程序源码

时间: 2024-10-13 11:18:21

LeetCode(25)Reverse Nodes in k-Group的相关文章

LeetCode(7)Reverse Integer

题目如下: C++代码: class Solution { public: int reverse(int x) { if( overflow(x) == true) { return 0; } int result = 0; while (x!=0) { result = 10*result + x%10; x /= 10; } return result; } private: bool overflow(int x)//此题要保证返回的整数位整型,确定的是x是一个整型 { //故要判断x是

LeetCode(24) Swap Nodes in Pairs

题目 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify the values in the list,

Leetcode(1)两数之和

Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 第一种方法:暴力 执行用时:5352 ms: 内存消耗:12.9MB 效果:非常差 class Solution(object): def twoSum(self, nums, target): """ :type nums:

02-线性结构3. 求前缀表达式的值(25)

02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之

pat02-线性结构3. 求前缀表达式的值(25)

02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之

HTML5移动开发之路(25)—— AppCan开发环境

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(25)-- AppCan开发环境 一.工具下载: 官方下载地址:http://www.appcan.cn/experience.html 按照安装指导默认安装即可 二.建立项目 启动AppCan SDK 建立项目 填入在appcan官网上注册的账号和密码,方便后面对应用的管理. 建立好的项目如下: 三.使用模拟器调试 右击index.html,选择预览 四.使用真机调试 1.下载真机调试工具:http://

从零开始编写自己的C#框架(25)——网站部署

导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附加数据库 10.添加数据库访问用户 11.设置数据库链接 对于网站的安全部署方面,大家请看我以前写的<服务器安全部署文档>里面已基本上将服务器相关的安全设置都讲到了,照着里面的操作一般的黑客是比较慢攻击进来的(代码漏洞除外),而本章的部署则是是该篇设置好的基础上来创建站点的. 1.关掉访问保护 打

(转载)你好,C++(25)函数调用和它背后的故事5.1.2 函数调用机制

你好,C++(25)函数调用和它背后的故事5.1.2 函数调用机制 5.1.2  函数调用机制 在前面的学习中,我们多次提到了“调用函数”的概念.所谓调用函数,就是将程序的执行控制权从调用者(某个函数)交给被调用的函数,同时通过参数向被调用的函数传递数据,然后程序进入被调用函数内部,执行函数定义中的代码获得结果数据,函数体代码执行完毕后再将控制权交回给调用者同时将结果数据通过返回值传递给调用者,作为整个函数调用表达式的值.简而言之,调用函数也就是执行函数中的代码,完成函数的功能. 在学习如何编写

优化数据页面(25)——每页打印标题行

优化数据页面(25)--每页打印标题行 设计要点:优化数据页面.界面设计.美化exce 阿金:说了半天的优化,都是针对显示的.其实还有一大块需要优化,那就是--打印页面. 秀秀:嗯.说得对. 阿金:光说"对"有什么用啊,给点具体的! 秀秀:别着急呀,俺正要说!最常用的就是,当数据量超出一页时,每页要重复标题行! 阿金:嗯,这还说到了点儿上! 秀秀:嚯!夸别人也是这种口气! 阿金:噢噢噢,习惯了,俺改. 秀秀:哼!本性难移! 版权声明:本文为博主原创文章,未经博主允许不得转载.