每天一道LeetCode-----将链表每k个节点逆序一次
来源:互联网 发布:金思维软件 编辑:程序博客网 时间:2024/05/21 15:51
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开始递归调用当前函数,思路都差不多
阅读全文
0 0
- 每天一道LeetCode-----将链表每k个节点逆序一次
- 将单链表的每k个节点之间逆序
- 将单链表的每k个节点之间逆序
- 每天一道LeetCode-----找到第k个排列
- [LeetCode]—Reverse Nodes in k-Group 将链表以n个节点为一组进行逆序
- 链表问题---将单链表的每K个节点之间逆序
- 每天一道LeetCode-----逆序链表
- day11之求二叉树的高度+销毁一颗二叉树+链表每K个节点之间逆序
- 每天一道LeetCode-----删除链表倒数第n个节点
- 每天一道LeetCode-----将数组/链表后k个元素移动到前面
- C++ 将单链表的每K个结点逆序
- 每间隔K个元素逆转一次单链表
- 单向链表每k个元素翻转一次。
- 单向链表每k个元素翻转一次。
- C++将单链表的每K个结点之间逆序改进版空间复杂度O(1)
- 每天一道LeetCode-----找到1,2,...,n这n个数所有的组合,每个组合有k个元素,且元素大小递增
- 每天一道LeetCode-----某个数在递增序列第一次和最后一次出现的位置
- 每10个显示一次
- 【Python初学笔记】输出中文的方法(字符编码)
- yii2.0的csrf问题
- 池化层的知识
- 用java代码Jdbc连接数据库
- android 初识WebView
- 每天一道LeetCode-----将链表每k个节点逆序一次
- Cookie/Session机制详解
- 解决使用Spring Boot、Multipartfile上传文件路径错误问题
- mysql大量数据导入导出
- windows下搭建virtualenv、virtualenvwrapper虚拟环境
- 做事的步骤
- 三维旋转:旋转矩阵,欧拉角,四元数
- leetcode 365. Water and Jug Problem
- 拖放 Drag 、Drop------------------Qt