之前说过很多遍,链表的反向是多么的重要。这道题又用到了。
链表的题是多么的无趣,也不知道面试的时候是不是会问这种。第一次反向的时候,要记得把头指针改一下,还有就是如果剩下的个数不够了,就不要翻转了,返回就行。
class Solution {
public:
void reversePart(ListNode* start){
if(start == NULL || !start->next) return;
ListNode *p=start, *pp = start->next, *ppp;
p->next = NULL;
while(pp != NULL){
ppp = pp->next;
pp->next = p;
p = pp;
pp = ppp;
if(pp) ppp = pp->next;
}
}
ListNode *reverseKGroup(ListNode *head, int k) {
if(!head||!head->next) return head;
ListNode *right, *pre=NULL, *newHead = head, *newStart = head, *ne;
int i;
while(newStart){
i=1;
right = newStart;
while(i<k&&right){
right = right->next;
i++;
}
if(!right) return newHead;
if(!pre) newHead = right;
ne = right->next;
right->next = NULL;
reversePart(newStart);
if(pre)
pre->next = right;
pre = newStart;
newStart->next = ne;
newStart = ne;
}
return newHead;
}
};