力扣算法题用c语言实现,刷题-力扣-25

刷题-力扣-25

25. K 个一组翻转链表

题目链接

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1-2-3-4-5

当 k = 2 时,应当返回: 2-1-4-3-5

当 k = 3 时,应当返回: 3-2-1-4-5

说明:

你的算法只能使用常数的额外空间。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

题目分析

根据题目描述,颠倒链表中k个结点

使用栈的后进先出的思想,让链表依次入栈k个到vecNode中

从vecNode中依次从后向前出栈到res的末尾

依次循环直到剩余的结点不够k个

把剩余不够k个的结点添加到res的末尾,res即为所求

代码

/**

* Definition for singly-linked list.

* struct ListNode {

* int val;

* ListNode *next;

* ListNode() : val(0), next(nullptr) {}

* ListNode(int x) : val(x), next(nullptr) {}

* ListNode(int x, ListNode *next) : val(x), next(next) {}

* };

*/

class Solution {

public:

ListNode* reverseKGroup(ListNode* head, int k) {

vectorListNode* vecNode;

ListNode* res = nullptr;

ListNode* p;

while (head) {

int i = 0;

for (i; i k; i++) {

if (head) {

vecNode.push_back(head);

head = head-next;

} else break;

}

if (vecNode.size() != k) break;

for (i; i 0; i--) {

if (res == nullptr) {

res = vecNode[i - 1];

p = res;

}

else {

p-next = vecNode[i - 1];

p = p-next;

p-next = nullptr;

}

}

vecNode.clear();

}

for (int i = 0; i vecNode.size(); i++) {

p-next = vecNode[i];

p = p-next;

p-next = nullptr;

}

return res;

}

};

刷题-力扣-25 相关文章

力扣605. 种花问题

原题 这题代码写得很烂 思路: 将flowerbed数组分段,记录区间端点是0是1,保证每个区间端点以外都是连续的0序列,最后对区间端点进行分类讨论 如flowerbed数组为[0,1,0,0,0,0,1] 则分段为: 【0,1】【1,0,0,0,0,1】 对应区间去除端点外所含0序列长度n

2021.2.10 刷题(判断一棵树是否是二叉搜索树)

题目链接:https://leetcode-cn.com/problems/validate-binary-search-tree 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。

2021.2.10 刷题(构造最大二叉树)

题目链接:https://leetcode-cn.com/problems/maximum-binary-tree 题目描述: 给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下: 二叉树的根是数组 nums 中的最大元素。 左子树是通过数组中 最大值左边部分 递归构

【题解】力扣992. K 个不同整数的子数组

题目来源 992. K 个不同整数的子数组 题目描述:给定一个正整数数组 A ,如果 A 的某个子数组中不同整数的个数恰好为 K ,则称 A 的这个连续、不一定独立的子数组为 好子数组 。 思路 恰好包含K种不同整数的子区间 = 最多包含K种整数的子区间 - 最多包含K-1

力扣567.字符串的排列—C语言实现

题目 来源:力扣(LeetCode)

【PAT刷题】快速产出垃圾——2020-2-9

接昨晚B1024/A1073 (2)参考答案 1 #include cstdio 2 #include cstring 3 4 int main(){ 5 char str[10010]; 6 scanf("%s",str); 7 int len = strlen(str); 8 if(str[0]=='-') printf("-"); //如果是负数,输出负号 9 10 int pos =0;11 while(str[pos]!='E

算法刷题指南来自GitHub 68.8k star的硬核算法教程

很多朋友害怕算法,其实大可不必,算法题无非就那几个套路,一旦掌握,就会觉得算法实在是太朴实无华且枯燥了! 本文选自硬核算法教程 《labuladong的算法小抄》 ,带你学习套路,把握各类算法问题的共性! 数据结构是工具,算法是通过合适的工具解决特定问

luogu集合刷题进阶

昨天光顾着跟kerin聊天忘记存盘了,写到一半的blog就,,,没了 今天主要是绿题 怕怕 , 主要是两个集合之间的东西,,,比如并查集 P1982 反集: 如果a和b是敌人,合并n+b和a,n+a和b 如果c和a是敌人,合并n+c和a,n+a和c 那么b和c就并在一起了 这样就符合了

【题解】力扣978. 最长湍流子数组

题目来源 978. 最长湍流子数组 方法一 滑动窗口,双指针 第一种情况和第二种情况分开讨论 当符合条件的时候, left 不动, right 加1; 不符合条件的时候, left 等于 right ; 窗口长度为 right-left+1 ; 长度为1的时候特判,返回1; 代码 class Solution

LeetCode刷题笔记 - 12. 整数转罗马数字

学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题。 官方链接:https://leetcode-cn.com/problemset/all/ 一、

你可能感兴趣的:(力扣算法题用c语言实现)