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

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

作者:Grey

原文地址:

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

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

题目描述

LeetCode 25. Reverse Nodes in k-Group

本题的 follow up 是:

text 复制代码
Follow-up: Can you solve the problem in O(1) extra memory space?

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

主要思路

本题需要设计两个方法:

第一个方法

java 复制代码
ListNode getKGroupEnd(ListNode start, int k)

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

比如链表为:

text 复制代码
...-> start -> b -> c -> d -> e

假设:k = 3

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

如果是下述情况

text 复制代码
...-> start -> b -> c -> null

假设:k = 6

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

java 复制代码
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之间的链表。

例如:原链表为:

text 复制代码
....->a->b->c->d->e....

假设:start = a, end = d

经过reverse方法,会变成

text 复制代码
...d->c->b->a->e.....

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

java 复制代码
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;
}

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

java 复制代码
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)\)。

更多

算法和数据结构学习笔记

算法和数据结构学习代码

参考资料

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

相关推荐
液态不合群1 分钟前
如何提升 C# 应用中的性能
开发语言·算法·c#
诗远Yolanda2 分钟前
EI国际会议-通信技术、电子学与信号处理(CTESP 2026)
图像处理·人工智能·算法·计算机视觉·机器人·信息与通信·信号处理
程序员-King.6 分钟前
day165—递归—最长回文子序列(LeetCode-516)
算法·leetcode·深度优先·递归
学嵌入式的小杨同学9 分钟前
【嵌入式 C 语言实战】栈、队列、二叉树核心解析:存储原理 + 应用场景 + 实现思路
linux·c语言·网络·数据结构·数据库·后端·spring
BHXDML11 分钟前
推导神经网络前向后向传播算法的优化迭代公式
神经网络·算法·机器学习
2401_8414956412 分钟前
【LeetCode刷题】删除链表的倒数第N个结点
数据结构·python·算法·leetcode·链表·遍历·双指针
叫我:松哥21 分钟前
基于YOLO深度学习算法的人群密集监测与统计分析预警系统,实现人群密集度的实时监测、智能分析和预警功能,支持图片和视频流两种输入方式
人工智能·深度学习·算法·yolo·机器学习·数据分析·flask
你撅嘴真丑22 分钟前
STL练习
开发语言·c++·算法
苦藤新鸡30 分钟前
28.两数相加,进位制
数据结构·算法·链表·力扣
Lips61136 分钟前
第七章 贝叶斯分类器
人工智能·算法·机器学习