首页 > 其他分享 >链表K个节点的组内逆序调整问题

链表K个节点的组内逆序调整问题

时间:2023-11-27 15:57:21浏览次数:37  
标签:end 组内 next 链表 start ListNode null 逆序

链表K个节点的组内逆序调整问题

作者:Grey

原文地址:

博客园:链表K个节点的组内逆序调整问题

CSDN:链表K个节点的组内逆序调整问题

题目描述

LeetCode 25. Reverse Nodes in k-Group

本题的 follow up 是:

Follow-up: Can you solve the problem in O(1) extra memory space?

即用\(O(1)\)的空间复杂度实现整个算法。

主要思路

本题需要设计两个方法:

第一个方法

ListNode getKGroupEnd(ListNode start, int k)

该方法表示:从链表start位置开始,数够k个位置,返回k个位置后的那个节点。

比如链表为:

...-> start -> b -> c -> d -> e

假设:k = 3

则:表示从start开始,数够 3 个,所以返回c节点

如果是下述情况

...-> start -> b -> c -> null

假设:k = 6

由于start后面不够 6 个节点,所以返回null,完整代码如下:

public static ListNode getKGroupEnd(ListNode start, int k) {
    while (--k != 0 && start != null) {
        start = start.next;
    }
    return start;
}

第二个方法void reverse(ListNode start, ListNode end),表示反转startend之间的链表。

例如:原链表为:

....->a->b->c->d->e....

假设:start = a, end = d

经过reverse方法,会变成

...d->c->b->a->e.....

reverse方法也相对比较简单,就是链表反转的一种特殊情况,实现代码如下:

public static void reverse(ListNode start, ListNode end) {
    end = end.next;
    ListNode pre = null;
    ListNode cur = start;
    while (cur != end) {
        ListNode tmp = cur.next;
        cur.next = pre;
        pre = cur;
        cur = tmp;
    }
    start.next = end;
}

有了上述两个方法,我们可以比较方便实现原题要求,主流程如下

public static ListNode reverseKGroup(ListNode head, int k) {
    ListNode start = head;
    ListNode end = getKGroupEnd(start, k);
    if (end == null) {
        return head;
    }
    // 第一组凑齐了!
    head = end;
    reverse(start, end);
    // 上一组的结尾节点
    ListNode lastEnd = start;
    while (lastEnd.next != null) {
        start = lastEnd.next;
        end = getKGroupEnd(start, k);
        if (end == null) {
            return head;
        }
        reverse(start, end);
        lastEnd.next = end;
        lastEnd = start;
    }
    return head;
}

整个过程时间复杂度\(O(N)\),空间复杂度\(O(1)\)。

更多

算法和数据结构学习笔记

算法和数据结构学习代码

参考资料

算法和数据结构体系班-左程云

标签:end,组内,next,链表,start,ListNode,null,逆序
From: https://www.cnblogs.com/greyzeng/p/17859529.html

相关文章

  • 刷题复习(一)链表
    刷题复习(一)链表https://labuladong.gitee.io/algo/di-ling-zh-bfe1b/shuang-zhi-0f7cc/1、合并两个有序链表思路清晰,双链表有个根节点记录开头/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*Lis......
  • 为什么全序集降位和和逆序对在同一长度的排列的分布相同?
    引入在q-analog中,我们知道:\[\sum_{p\inS}q^{\operatorname{maj}(p)}=\sum_{p\inS}q^{\tau(p)}=\binom{\suma_i}{a_1,a_2,\dots,a_n}_q\]其中\(S\)是\(a_i\)个\(i\)元素(对于所有\(i\))构成的排列集合。\[\operatorname{maj}(p)=\sum_{i<\suma_i}i[p_i>p......
  • 双链表
    一、算法描述本篇文章讲述的数据结构是双链表,与上一篇文章一样是算法竞赛中常用的用数组模拟的双链表。//用数组模拟的双链表定义如下:inte[N],l[N],r[N],idx;/* e[i]表示节点i的值 l[i]表示节点i的左边一个节点 r[i]表示节点i的右边一个节点 idx表示当前用到了哪个节......
  • 单链表
    一、算法描述本篇文章讲述的数据结构是单链表,当然不是常规的单链表,而是算法竞赛中常用的用数组模拟的单链表。//常规的单链表定义如下:struct{intval;Node*next;}//用数组模拟的单链表定义如下:inthead;inte[N],ne[N],idx;/* head表示头结点的下标 e[......
  • 约瑟夫(环形链表)
    约瑟夫(环形链表)/***@author缪广亮*@version1.0*/classJoseph{publicstaticvoidmain(String[]args){CircleSingleLinkedListcircleSingleLinkedList=newCircleSingleLinkedList();circleSingleLinkedList.addBoy(5);circ......
  • 链表和双线链表
    单链表1.创建一个Node类//head不能动,头节点作用是表示链表的头privateNodehead;//在linkedList类写一个Node的成员内部类privateclassNode{privateintdata;privateNodenext;publicNode(intdata){this.data=data;th......
  • 直接讲清楚反转链表和判断子链表是怎么搞的【python】
    Reversed_sub反向子链表题,直接把反向链表和子链表讲清楚。反向假设有一个链表:1->2->3->4->None初始化三个指针:prev:用于指向当前节点的前一个节点。初始时prev为None。current:用于指向当前节点。初始时current指向链表的头节点。next:用于保存当前节点的下一......
  • 代码随想录-链表
    203.移除链表元素https://leetcode.cn/problems/remove-linked-list-elements/description//***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):......
  • 反转链表系列问题
    反转链表系列问题作者:Grey原文地址:博客园:反转链表系列问题CSDN:反转链表系列问题反转单链表题目描述见:LeetCode206.ReverseLinkedList思路如下对于任何一个节点cur来说,记录一个前驱节点pre(第一个节点的前驱节点是null)先用一个临时节点tmp记录cur的下一个......
  • 删除有序链表中重复的元素-I
    publicListNodedeleteDuplicates(ListNodehead){//writecodehereListNodecur=head;while(cur!=null){while(cur.next!=null&&cur.val==cur.next.val){ListNodetemp=cur.next.next;//这里牵扯到内存......