刷题记录第109天-K个一组反转链表
解题思路:
第一步:实现一个数组,给定一段链表的头结点和尾节点,反转该链表,并返回新的头结点和尾结点。
第二步:初始化一个虚拟头结点,用于记录最终头结点和规范操作。
第三步:给定一个初始头结点head,先走k步得到尾结点tail,如果走不到,则证明剩下的不足K哥啊,可直接return。否则,就调用第一步的函数反转此时的[head,tail]之间的链表,并将这个链表接回到原始链表中(这里需要记录每组链表头结点的前一个节点prev),重复该操作,直到head为空。
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;}
};