20230616-Codetop

141 阅读1分钟

前一段时间一直在搞论文和入职,算法题放下了。今天开始重新拾起来,一道题复健

leetcode 25 K个一组反转链表

没啥好说的,就模拟。但确实比较练基本功,适合复健。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

class Solution {
public:
    void reverse(ListNode* start_prev, ListNode* end){ // (start_prev, end]
        if(start_prev->next == end) return;
        ListNode* p_prev = start_prev;
        ListNode* p = start_prev->next;
        ListNode* q = start_prev->next->next;
        while(q != end->next){
            p->next = p_prev;
            p_prev = p;
            p = q;
            q = q->next;
        }
        p->next = p_prev;
        start_prev->next->next = q;
        start_prev->next = p;
    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(!head || !head->next || k == 1) return head;
        auto* dummy_head = new ListNode(0, head);
        ListNode* p_prev = dummy_head;
        ListNode* p = head;
        while(p){
            int tmp = k;
            ListNode* end = p_prev;
            while(tmp > 0 && end){
                end = end->next;
                --tmp;
            }
            if(tmp > 0 || !end) break;
            reverse(p_prev, end);
            p_prev = p;
            p = p->next;
        }
        return dummy_head->next;
    }
};

虚拟头节点确实很好用,避免了很多特判。做链表题一定要画图,靠脑子想大概率出问题甚至猪脑过载。