题目描述:
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
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
Note:
- Only constant extra memory is allowed.
- You may not alter the values in the list's nodes, only nodes itself may be changed.
算法描述:
整个过程分两步进行:对任一链表进行反转;将原链表分成长度为k的子链表,分别反转后链接起来
算法实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverse(ListNode* head){
if(head -> next == NULL) return head;
ListNode *p1 = head, *p2 = head -> next, *p = head;
head -> next = NULL;
while(p != NULL){
p = p2 -> next;
p2 -> next = p1;
p1 = p2;
p2 = p;
}
return p1;
}
ListNode* reverseKGroup(ListNode* head, int k) {
if(head == NULL) return head;
if(head -> next == NULL || k == 1) return head;
ListNode *h = head, *hk, *hkn, *res_end;
ListNode *res = new ListNode(0);
res_end = res;
hk = h;
while(hk != NULL){
for(int i = 0; i < k - 1; i ++){
if(hk -> next == NULL)
{
res_end -> next = h;
return res -> next;
}
hk = hk->next;
}
hkn = hk -> next;
hk -> next = NULL;
res_end -> next = reverse(h);
h -> next = NULL;
res_end = h;
h = hkn, hk = hkn;
}
return res -> next;
}
};