• Leetcode 25. K 个一组反转链表


    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

    k 是一个正整数,它的值小于或等于链表的长度。

    如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

    进阶:

    你可以设计一个只使用常数额外空间的算法来解决此问题吗?
    你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
     

    示例 1:


    输入:head = [1,2,3,4,5], k = 2
    输出:[2,1,4,3,5]
    示例 2:


    输入:head = [1,2,3,4,5], k = 3
    输出:[3,2,1,4,5]
    示例 3:

    输入:head = [1,2,3,4,5], k = 1
    输出:[1,2,3,4,5]
    示例 4:

    输入:head = [1], k = 1
    输出:[1]
    提示:

    列表中节点的数量在范围 sz 内
    1 <= sz <= 5000
    0 <= Node.val <= 1000
    1 <= k <= sz

    思路:先遍历一遍找出长度n,然后i<=n-k;i+=k,对于内部每次k个进行翻转,并将翻转后的p=翻转开始前保存的head,

    /**
     * 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:
        ListNode* reverseKGroup(ListNode* head, int k) {
            int n=0;
            ListNode* p=head;
            while(p!=NULL){
                n++;
                p=p->next;
            }
            ListNode node;
            p=&node;
            for(int i=0;i<=n-k;i+=k){
                ListNode* t=head;
                for(int j=0;j<k;++j){
                    ListNode* next=head->next;
                    head->next=p->next;
                    p->next=head;
                    head=next;
                }
                p=t;
            }
            p->next=head;
            return node.next;
        }
    };

     第二种思路:

    递归: 

    labuladong递归思维:k 个一组反转链表

    1、迭代实现反转k个长度的链表,注意 reverse 函数是反转区间 [a, b)

     2、将第 k + 1 个元素作为 head 递归调用 reverseKGroup 函数

     

    class Solution {
    public:
        ListNode* reverseKGroup(ListNode* head, int k) {
            if(head==NULL) return NULL;
            ListNode* a=head;
            ListNode* b=head;
            for(int i=0;i<k;++i){
                if(b==NULL) return head;
                b=b->next;
            }
            ListNode* newHead=reverse(a,b);
            a->next=reverseKGroup(b,k);
            return newHead;
        }
        ListNode* reverse(ListNode* a, ListNode* b) {
            ListNode* pre=NULL;
            ListNode* cur=a;
            ListNode* next=a;
            while(cur!=b){
                next=cur->next;
                cur->next=pre;
                pre=cur;
                cur=next;
            }
            return pre;
        }
    };
    联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
  • 相关阅读:
    倍增_ST表与LCA
    树状数组
    CF1365B 题解
    左偏树
    ES5_04_Array扩展
    ES5_03_Object扩展
    ES5_05_Function扩展
    前台样式与实际开发应用
    利用Mircosoft URLRewriter.dll实现页面伪静态(伪静态系列一)
    递归算法常见习题代码(控制台程序)
  • 原文地址:https://www.cnblogs.com/zl1991/p/14669250.html
Copyright © 2020-2023  润新知