• 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;
        }
    };

  • 相关阅读:
    lvs中dr模式配置脚本
    使用AFNetworking第三方下载类
    java 经常使用測试框架
    Qt5的插件机制(1)--Qt 框架中的插件载入机制概述
    leetcode笔记:Merge Sorted Array
    oracle仿全文检索切词机制实现文本信息类似度查找
    hadoop学习;datajoin;chain签名;combine()
    php函数in_array奇怪现象
    Sql_Server中怎样推断表中某列是否存在
    Java Bean 简单介绍及其应用
  • 原文地址:https://www.cnblogs.com/pursuiting/p/14608926.html
Copyright © 2020-2023  润新知