zoukankan      html  css  js  c++  java
  • 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:
        // 翻转一个子链表,并且返回新的头与尾
        pair<ListNode*, ListNode*> myReverse(ListNode* head, ListNode* tail) {
            ListNode* prev = tail->next;
            ListNode* p = head;
            while (prev != tail) {
                ListNode* nex = p->next;
                p->next = prev;
                prev = p;
                p = nex;
            }
            return { tail, head };
        }
    
        ListNode* reverseKGroup(ListNode* head, int k) {
            // hair->next保存的是整个链表的头结点
            ListNode* hair = new ListNode(0);
            hair->next = head;
            ListNode* pre = hair;
    
            // 循环里,head被重复作为每一组链表的第一个结点,tail被重复作为每一组链表的最后一个节点
            while (head) {
                // pre->next保存每一组链表的第一个节点
                ListNode* tail = pre;
                // 查看剩余部分长度是否大于等于 k
                for (int i = 0; i < k; ++i) {
                    tail = tail->next;
                    if (!tail) {
                        return hair->next;
                    }
                }
                // nex保存每一组链表最后一个节点的后继节点
                ListNode* nex = tail->next;
    
                pair<ListNode*, ListNode*> result = myReverse(head, tail);
                head = result.first;
                tail = result.second;
                // 这里是 C++17 的写法
                // tie(head, tail) = myReverse(head, tail);
                // 把子链表重新接回原链表
                pre->next = head;
                tail->next = nex;
                // pre保存本组的最后一个节点,因此在下一次循环中,pre->next即为下一组的第一个节点,
                // 进而起到链接上下两个组的作用
                pre = tail;
                // 当链表的节点个数是k的整数时,最后一次翻转之后,tail->next为nullptr,从而跳出循环
                head = tail->next;
            }
    
            return hair->next;
        }
    };

  • 相关阅读:
    Log4Net 自定义级别,分别记录到不同的文件中
    带着忧伤,寻觅快乐
    程序员进阶学习书籍
    PHP编码技巧
    PHP精度问题
    Laravel5 构造器高级查询条件写法
    正则表达式 /i /g /m /ig /gi
    MySQL运算符的优先级
    PHP获取当前页面完整路径URL
    使用ssl模块配置同时支持http和https并存
  • 原文地址:https://www.cnblogs.com/pursuiting/p/14608926.html
Copyright © 2011-2022 走看看