25. Reverse Nodes in k-Group
2016-03-05 20:20
417 查看
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
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
解法:
采用递归法或者迭代法/** * 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 || !head->next || k < 2) return head; ListNode* next_group = head; for(int i =0 ;i < k ; ++i){ if(next_group) next_group =next_group->next; else return head; } ListNode* next_head = reverseKGroup(next_group,k); ListNode *pre = NULL , *cur = head; while(cur != next_group) { ListNode* next = cur->next; cur->next = pre?pre:next_head; pre = cur; cur = next; } return pre; } };
class Solution { public: istNode *reverseKGroup(ListNode *head, int k) { if (head == nullptr || head->next == nullptr || k < 2) return head; ListNode dummy(-1); dummy.next = head; for(ListNode *prev = &dummy, *end = head; end; end = prev->next) { for (int i = 1; i < k && end; i++) end = end->next; if (end == nullptr) break; // 不足 k 个 prev = reverse(prev, prev->next, end); } return dummy.next; } // prev 是 first 前一个元素, [begin, end] 闭区间,保证三者都不为 null // 返回反转后的倒数第 1 个元素 ListNode* reverse(ListNode *prev, ListNode *begin, ListNode *end) { ListNode *end_next = end->next; for (ListNode *p = begin, *cur = p->next, *next = cur->next; cur != end_next;p = cur, cur = next, next = next ? next->next : nullptr) { cur->next = p; } begin->next = end_next; prev->next = end; return begin; } };
相关文章推荐
- Permission denied user=hadoop access=WRITE inode=root rootsupergroup rwxr
- Node.Js
- 前端学习总结(八)NodeJS——前端工程师通向后端的里程碑
- Node.js编程快餐(2) - 处理命令行参数
- leetcode237 Delete Node in a Linked List
- DataNode中block的存放位置和大小
- namenode中元数据的安全性
- Node.js是什么
- hadoop集群启动成功但live node为0
- node.js获取RSS返回json
- node.js实现图片验证码
- /usr/bin/env: node: no such file or directory
- Window下配置NodeJs环境详解
- 多核单服务器各种配置和业务压力下的node.js性能测试
- 解决关闭Hadoop时no namenode to stop异常
- nodejs的express使用介绍
- Delete Node in a Linked List
- nodejs小问题:express不是内部或外部命令
- Nodejs初阶之express
- 使用WeCloud消息推送接口发送消息NodeJs版