每K个node翻转一次,最后一组不够K个的不翻转。
有多种方法实现。
我本来理解的题意是不够K个的有几个翻转几个,在写完代码后才发现最后不够K个不翻转,所以,我最后改了改,实现的是,每一组都翻转,不够K个的时候由翻转后的再翻转回来。实际上一开始就可以写成不够K个不翻转,代码有点冗余了。
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: a ListNode
* @param k: An integer
* @return: a ListNode
*/
ListNode * reverseKGroup(ListNode * head, int k) {
ListNode * dummy = new ListNode(0);
dummy->next = head;
ListNode * tail = dummy;
ListNode * crt = head;
ListNode * prev = NULL;
while (crt != NULL) {
ListNode * k_tail = crt;
prev = NULL;
for (int i = 0; i < k; i++) {
if (crt == NULL) {
prev = reverse(prev);
break;
}
ListNode *temp = crt->next;
crt->next = prev;
prev = crt;
crt = temp;
}
tail->next = prev;
tail = k_tail;
}
return dummy->next;
}
ListNode * reverse(ListNode * head) {
ListNode * prev = NULL;
ListNode * crt = head;
while (crt != NULL) {
ListNode * temp = crt->next;
crt->next = prev;
prev = crt;
crt = temp;
}
return prev;
}
};