每天一道LeetCode-----将链表每k个节点逆序一次
Swap Nodes in Pairs
原题链接 Swap Nodes in Pairs
意思是将链表每两个节点互换位置,要求不能直接改变链表的值,只能改变next指针的方式交换
其实就是遍历一遍每两个交换即可,方法比较随意
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(!head)return head;/* 增加一个前驱节点,解决头部节点改变的问题 */ListNode* header = new ListNode(-1);header->next = head;/* 每次都移动两步,直接交换,如果不足两步,就退出 */ListNode* cur = head->next;ListNode* prv = head;ListNode* prv_last = header;while(cur){ListNode* next = cur->next;prv_last->next = cur;cur->next = prv;prv->next = next;if(next && next->next){prv_last = prv;prv = next;cur = next->next;}else{break;}}ListNode* res = header->next;delete header;return res;}
};
Reverse Nodes in k-Group
扩展方面就是把2改成k,即每k个逆序一次
原题链接Reverse Nodes in k-Group
意思是每k个节点逆序一次,如果不足k个,就不需要改变
方法和上面一样,只是每次逆序k个,然后移动k步。首先计算链表节点总数,每逆序k个就减k,不足k时退出
/*** 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) {if(!head || k <= 1)return head;/* 计算链表节点数 */int n = listLen(head);ListNode* header = new ListNode(-1);header->next = head;ListNode* cur = header;while(n >= k){/* * 记录当前节点的下一个节点,从下一个节点开始逆序k个* 返回逆序后的第一个节点,这个next节点变成第k个节点* 移动k步* 总数-k,判断是否还需要继续逆序*/ListNode* next = cur->next;cur->next = kReverse(next, k);cur = next;n -= k;}ListNode* res = header->next;delete header;return res;}
private:int listLen(ListNode* head){int n = 0;while(head){++n;head = head->next;}return n;}ListNode* kReverse(ListNode* head, int k){ListNode* cur = head;ListNode* prv = NULL;while(k--){ListNode* next = cur->next;cur->next = prv;prv = cur;cur = next;}/* * 这里比较重要,因为逆序后,prv变成第一个节点,head变成最后一个节点* 此时需要改变head的next指向逆序前的第k+1个节点* 这个节点正好是cur*/head->next = cur;return prv;}
};
还有一种方法是通过递归,容易理解些,从当前head开始逆序k个,然后从第k+1开始递归调用当前函数,思路都差不多
每天一道LeetCode-----将链表每k个节点逆序一次相关推荐
- 每天一道LeetCode-----将数组/链表后k个元素移动到前面
Rotate Array 原题链接Rotate Array 回转一个给定数组k步,本质上是将后k个元素移动到前面(需要保证k小于数组元素个数) 不在原数组上操作的话比较简单,新开一个vector保存回 ...
- 单链表的前K个的逆序输出
单链表逆序输出也是常被面试官问到题算法题,所以自己就总结了一下,在此贴出算法,与小伙伴们相互交流. 首先要有三个指针,前两个分别指向首节点,首节点的下一个节点,第三个是临时指针,是为了储存首节点的下一 ...
- 【C语言】单向链表排序、合并、逆序、分离(链表的头节点不储存数据)
一.排序 编写程序,在第1题(第1题:编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁 ...
- 剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)
题目描述 给定一棵二叉搜索树,请找出其中第k大的节点. 思路 详见链接 代码 class Solution:def kthLargest(self, root:TreeNode, k:int)-> ...
- LeetCode 1265. 逆序打印不可变链表(递归)
文章目录 1. 题目 2. 解题 1. 题目 给您一个不可变的链表,使用下列接口逆序打印每个节点的值: ImmutableListNode: 描述不可变链表的接口,链表的头节点已给出. 您需要使用以下 ...
- 【C++】链表反转逆序|建立、删除、修改、插入|linux内核链表与普通链表
目录 C++实现链表逆序 链表的建立.删除.修改.插入 linux内核链表与普通链表 C++实现链表逆序 实现链表逆序,首先要有一个链表,下面是链表的结构体: typedef struct listn ...
- c语言递归链表逆序,链表逆序的递归实现
链表逆序是个很基础的算法,考察的是指针操作和基本数据结构.常规的写法当然是OK的,不过要是还会写出一个递归的链表逆序算法,那别人肯定要给你点个赞了. 1 问题描述 给定一个链表,请将其逆序.即如果链表 ...
- C语言的单链表逆序和指定范围逆序
文章目录 前言 逆序 指定范围逆序 源码实现 前言 关于链表的逆置,是考察对链表指针的理解.知道了如何不实用额外空间,同时使用O(n)复杂度对链表进行逆序之后将会对链表有好理解. 同时关于如何在指定范 ...
- c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...
最新文章
- 美多商城之订单(我的订单)
- 【项目展示】一个有点难度的猜数字小游戏(Java编写)
- 【opencv】YUV各种色彩、YUV420sp2RGB
- 云在天之南——我的七天七夜(率性苍山洱海)
- oppo手机显示andrOid什么意思,OPPO R17 Pro手机状态栏图标分别代表什么意思?
- 使用Apriori算法和FP-growth算法进行关联分析
- ifconfig命令举例
- c mysql 包含字符串_Mysql字符串字段判断是否包含某个字符串的2种方法
- carray 、clist、cmap
- Palo Alto推出全新Traps高级终端功能,强化勒索软件防御优势
- SAP 软件PS 模块系统操作之一工作分解结构(WBS)的创建
- Excel粘贴时如何跳过隐藏单元格
- mpvue小程序《校友足迹》成长记(一)
- 盘古开源:汽车芯片短缺怎样缓解?工信部回应热点问题
- Google Authenticator(谷歌身份验证器)C#版
- 成功操盘手必经的5个阶段
- WAF是什么东西?!--- 1 waf的功能和用到的技术原理介绍
- FPS透视原理(完)
- sklearn决策树(Decision Trees)模型
- 期货缠论 期货缠论自动画线指标 期货缠论5分钟战法 缠论期货交易 缠中说禅 缠论笔 线段走势买卖点
热门文章
- C语言学习之输出4X5的矩阵
- 计算机在材料科学的应用论文,计算机在材料科学中的应用论文
- ASP.NET MVC 后台传值前端乱码解决方案 富文本Ueditor编辑
- Docker手动构建 nginx+py3+uwsgi环境
- Oracle数据库使用Analyze提升sql性能
- luogu1991 无线通讯网
- python中常用的函数
- springboot读取自定义properties文件
- java 求集合平均数_图像二值化方法介绍(转载学习)
- [渗透攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包