题意:
给出一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
解法:
1、预设一个节点,指向头节点。
2、找到第k个节点并保存下一个节点knext后,如果当前节点为NULL停止操作;否则将第k个节点的next设置为NULL,然后对当前节点到第k个节点之间进行反转,将当前节点节点的前一个节点重新指向反转后的链表段的第一个节点,当前节点指向knext节点。
3、重复上述操作,直到跳出。
总结:
这一题主要是链表的反转操作加k个节点判断,要确定每一段的前一个节点,第一个节点,最后一个节点和最后一个节点的后一个节点。
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode *cur = head;
ListNode beforehead(0);
beforehead.next = head;
ListNode *pre = &beforehead;
ListNode *next =&beforehead ;
ListNode *end =&beforehead ;
while(end->next){
for(int i=0;i<k&&end;i++){
end = end->next;
}
if(!end){
break;
}
next = end->next;
end->next = NULL;
cur = pre->next;
pre->next = reverse(pre->next);
pre = cur;
cur->next = next;
end = cur;
}
return beforehead.next;
}
ListNode* reverse(ListNode* start){
ListNode* cur=start;
ListNode* pre=NULL;
ListNode* next;
while(cur){
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}