leetcode | Reverse Nodes in k-Group
2015-07-18 16:12
281 查看
Reverse Nodes in k-Group : https://leetcode.com/problems/reverse-nodes-in-k-group/
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
每k个节点逆转一次,相当于把 k个节点的链表 逆序,那么我们只需要先 分割出 k 个节点的链表。然后对每一组链表,执行一次单链表逆序。
单链表逆序:/article/9789204.html
关键点是: 如何把各个组逆序后的链表,重新组合起来。
我们首先通过递归方式,找出 1 个 K Group的头和尾(注:不包括这个尾节点),然后以这一个K Group的尾作为下一个K Group的头。 当对其中一个 K Group执行单链表逆序时,应该注意:最后新链表尾节点指向的是下一个K Group的开头;而判断是否为新链表尾部,则判断 prev == NULL ,因为我们设定一个链表的尾部为NULL.
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
每k个节点逆转一次,相当于把 k个节点的链表 逆序,那么我们只需要先 分割出 k 个节点的链表。然后对每一组链表,执行一次单链表逆序。
单链表逆序:/article/9789204.html
关键点是: 如何把各个组逆序后的链表,重新组合起来。
我们首先通过递归方式,找出 1 个 K Group的头和尾(注:不包括这个尾节点),然后以这一个K Group的尾作为下一个K Group的头。 当对其中一个 K Group执行单链表逆序时,应该注意:最后新链表尾节点指向的是下一个K Group的开头;而判断是否为新链表尾部,则判断 prev == NULL ,因为我们设定一个链表的尾部为NULL.
/** * 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 == NULL || head->next == NULL || k < 2) return head; ListNode* k_group = head; // 一个K组以head开始以k_group结束(不包括k_group) for (int i = 0; i < k ; i++) { if (k_group) k_group = k_group->next; else return head; } // next_k_group:下一个 K Group 的 head ListNode* next_k_group = reverseKGroup(k_group, k); ListNode* prev = NULL; ListNode* cur = head; while (cur != k_group) { ListNode* next = cur->next; cur->next = (prev == NULL) ? next_k_group : prev; // 逐个逆序,prev == NULL 代表是逆序完成后的尾节点 prev = cur; cur = next; } return prev; } };
相关文章推荐
- Node.js开发环境配置
- 学习老外用webstorm开发nodejs的技巧--代码提示DefinitelyTyped
- Node 实现 AES 加密,结果输出为“byte”。
- Delete Node in a Linked List
- Remove Nth Node From End of List
- [LeetCode]Delete Node in a Linked List
- leetcode | Swap Nodes in Pairs in a linklist
- ubuntu server 14.10 安装 nodejs
- Delete Node in a Linked List
- Node实践之二
- Windows环境下的nodejs环境开发搭建
- 在hadoop2实际生产环境中,为什么还需要SecondeNamenode
- Delete Node in a Linked List
- datanode无法启动 或 DFS Used% :100 % 或 Live Nodes
- Populating Next Right Pointers in Each Node
- 【node.js】安装express后,'express' 不是内部或外部命令的问题
- nodejs 调度 node-schedule 使用
- Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解
- Windows环境下的NodeJS+NPM+GIT+Bower安装配置步骤
- win7下,安装node-inspector调试Node.js