解题思路:
第一步:实现一个数组,给定一段链表的头结点和尾节点,反转该链表,并返回新的头结点和尾结点。
第二步:初始化一个虚拟头结点,用于记录最终头结点和规范操作。
第三步:给定一个初始头结点head,先走k步得到尾结点tail,如果走不到,则证明剩下的不足K哥啊,可直接return。否则,就调用第一步的函数反转此时的[head,tail]之间的链表,并将这个链表接回到原始链表中(这里需要记录每组链表头结点的前一个节点prev),重复该操作,直到head为空。
cpp
class Solution {
public:
// 翻转一个子链表,并且返回新的头与尾
pair<ListNode*,ListNode*> reverse(ListNode* head,ListNode* tail){
ListNode* prev=tail->next;
ListNode* cur_p=head;
while(prev!=tail){
ListNode* next = cur_p->next;
cur_p->next = prev;
prev = cur_p;
cur_p = next;
}
return {tail,head};
}
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* prev = dummy;
while(head!=nullptr){
ListNode* tail=prev;
for(int i=0;i<k;i++){
tail = tail->next;
if(tail==nullptr){
return dummy->next;
}
}
pair<ListNode*,ListNode*> result = reverse(head,tail);
head = result.first;
tail = result.second;
prev->next=head;
prev=tail;
head=tail->next;
}
return dummy->next;
}
};