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个节点逆序一次相关推荐

  1. 每天一道LeetCode-----将数组/链表后k个元素移动到前面

    Rotate Array 原题链接Rotate Array 回转一个给定数组k步,本质上是将后k个元素移动到前面(需要保证k小于数组元素个数) 不在原数组上操作的话比较简单,新开一个vector保存回 ...

  2. 单链表的前K个的逆序输出

    单链表逆序输出也是常被面试官问到题算法题,所以自己就总结了一下,在此贴出算法,与小伙伴们相互交流. 首先要有三个指针,前两个分别指向首节点,首节点的下一个节点,第三个是临时指针,是为了储存首节点的下一 ...

  3. 【C语言】单向链表排序、合并、逆序、分离(链表的头节点不储存数据)

    一.排序 编写程序,在第1题(第1题:编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁 ...

  4. 剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)

    题目描述 给定一棵二叉搜索树,请找出其中第k大的节点. 思路 详见链接 代码 class Solution:def kthLargest(self, root:TreeNode, k:int)-> ...

  5. LeetCode 1265. 逆序打印不可变链表(递归)

    文章目录 1. 题目 2. 解题 1. 题目 给您一个不可变的链表,使用下列接口逆序打印每个节点的值: ImmutableListNode: 描述不可变链表的接口,链表的头节点已给出. 您需要使用以下 ...

  6. 【C++】链表反转逆序|建立、删除、修改、插入|linux内核链表与普通链表

    目录 C++实现链表逆序 链表的建立.删除.修改.插入 linux内核链表与普通链表 C++实现链表逆序 实现链表逆序,首先要有一个链表,下面是链表的结构体: typedef struct listn ...

  7. c语言递归链表逆序,链表逆序的递归实现

    链表逆序是个很基础的算法,考察的是指针操作和基本数据结构.常规的写法当然是OK的,不过要是还会写出一个递归的链表逆序算法,那别人肯定要给你点个赞了. 1 问题描述 给定一个链表,请将其逆序.即如果链表 ...

  8. C语言的单链表逆序和指定范围逆序

    文章目录 前言 逆序 指定范围逆序 源码实现 前言 关于链表的逆置,是考察对链表指针的理解.知道了如何不实用额外空间,同时使用O(n)复杂度对链表进行逆序之后将会对链表有好理解. 同时关于如何在指定范 ...

  9. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

最新文章

  1. 美多商城之订单(我的订单)
  2. 【项目展示】一个有点难度的猜数字小游戏(Java编写)
  3. 【opencv】YUV各种色彩、YUV420sp2RGB
  4. 云在天之南——我的七天七夜(率性苍山洱海)
  5. oppo手机显示andrOid什么意思,OPPO R17 Pro手机状态栏图标分别代表什么意思?
  6. 使用Apriori算法和FP-growth算法进行关联分析
  7. ifconfig命令举例
  8. c mysql 包含字符串_Mysql字符串字段判断是否包含某个字符串的2种方法
  9. carray 、clist、cmap
  10. Palo Alto推出全新Traps高级终端功能,强化勒索软件防御优势
  11. SAP 软件PS 模块系统操作之一工作分解结构(WBS)的创建
  12. Excel粘贴时如何跳过隐藏单元格
  13. mpvue小程序《校友足迹》成长记(一)
  14. 盘古开源:汽车芯片短缺怎样缓解?工信部回应热点问题
  15. Google Authenticator(谷歌身份验证器)C#版
  16. 成功操盘手必经的5个阶段
  17. WAF是什么东西?!--- 1 waf的功能和用到的技术原理介绍
  18. FPS透视原理(完)
  19. sklearn决策树(Decision Trees)模型
  20. 期货缠论 期货缠论自动画线指标 期货缠论5分钟战法 缠论期货交易 缠中说禅 缠论笔 线段走势买卖点

热门文章

  1. C语言学习之输出4X5的矩阵
  2. 计算机在材料科学的应用论文,计算机在材料科学中的应用论文
  3. ASP.NET MVC 后台传值前端乱码解决方案 富文本Ueditor编辑
  4. Docker手动构建 nginx+py3+uwsgi环境
  5. Oracle数据库使用Analyze提升sql性能
  6. luogu1991 无线通讯网
  7. python中常用的函数
  8. springboot读取自定义properties文件
  9. java 求集合平均数_图像二值化方法介绍(转载学习)
  10. [渗透攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包