LeetCode 热题 100 | 链表(中下)

news2024/12/24 2:52:08

目录

1  19. 删除链表的倒数第 N 个节点

2  24. 两两交换链表中的节点

3  25. K 个一组翻转链表

4  138. 随机链表的复制


菜鸟做题第三周,语言是 C++

1  19. 删除链表的倒数第 N 个节点

到底是节点还是结点。。。

解题思路:

  1. 设置双指针 left 和 right
  2. 先让 right 右移 n 格
  3. 再让 left 和 right 一起右移直至 right 指向 nullptr
  4. left 将恰好处于被删除节点的前一个节点

思路说明图:

这个虚拟节点(dummy node)的设置非常巧妙,完美处理了被删除节点是头节点的情况。

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode * dummy = new ListNode(0, head);
        ListNode * left = dummy, * right = head;

        for (int i = 0; i < n; ++i) {
            right = right->next;
        }
        while (right) {
            left = left->next;
            right = right->next;
        }
        left->next = left->next->next;
        return dummy->next;
    }
};

虽然不设置虚拟节点(dummy node)也能做,但是写 if 语句的模样真的很狼狈。

2  24. 两两交换链表中的节点

思路很简单,一组一组地交换即可,关键在于保存需要再次使用到的节点指针。

public:
    ListNode* swapPairs(ListNode* head) {
        ListNode * dummy = new ListNode(0, head);
        ListNode * prev = dummy, * post = nullptr;
        ListNode * left = head, * right = head ? head->next : nullptr;

        while (left && right) {
            post = right->next;
            right->next = left;
            left->next = post;
            prev->next = right;
            prev = left;
            left = post ? post : nullptr;
            right = post ? post->next : nullptr;
        }
        return dummy->next;
    }
};

说明:以下是为了防止指针越界而进行的判断

left = post ? post : nullptr;
right = post ? post->next : nullptr;

3  25. K 个一组翻转链表

是上一题的升级版。

解题思路:

  • 设置 prev、left、right、temp、next 指针
  • prev 用于保存上一组的尾巴
  • left 用于保存当前组的头部
  • right 和 temp 一起右移,对每一个指针进行反向

是不是看起来很烦,但确实可能要使用到很多指针。

我加了一个函数来判断剩余部分还能不能构成 K 个一组:

bool isEnough(ListNode * p, int k) {
    int count = 0;
    while (p && count < k) {
        p = p->next;
        ++count;
    }
    return count == k;
}

 其实思路也不难,就是容易转晕:

class Solution {
public:
    bool isEnough(ListNode * p, int k) {
        int count = 0;
        while (p && count < k) {
            p = p->next;
            ++count;
        }
        return count == k;
    }

    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode * dummy = new ListNode(0, head);
        ListNode * left = head, * right = head->next;

        ListNode * prev = dummy;
        while (isEnough(left, k)) {
            int count = 1;
            ListNode * temp = left;
            while (count < k) {
                ++count;
                ListNode * next = right->next;
                right->next = temp;
                temp = right;
                right = next;
            }
            prev->next = temp;
            prev = left;
            left->next = right;
            left = right;
            right = left ? left->next : nullptr;
        }
        return dummy->next;
    }
};

4  138. 随机链表的复制

这道题用递归真是太神奇了,可惜我不会。。。

class Solution {
public:
    unordered_map<Node *, Node *> cachedNode;
    Node* copyRandomList(Node* head) {
        if (head == nullptr) return nullptr;

        if (!cachedNode.count(head)) {
            Node * headNew = new Node(head->val);
            cachedNode[head] = headNew;
            headNew->next = copyRandomList(head->next);
            headNew->random = copyRandomList(head->random);
        }
        return cachedNode[head];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ReactNative实现一个圆环进度条

我们直接看效果&#xff0c;如下图 我们在直接上代码 /*** 圆形进度条*/ import React, {useState, useEffect} from react; import Svg, {Circle,G,LinearGradient,Stop,Defs,Text, } from react-native-svg; import {View, StyleSheet} from react-native;// 渐变色 const C…

少儿编程教育新趋势:信息学奥赛与Scratch等级考试融合实践

近年来&#xff0c;信息学奥林匹克竞赛&#xff08;简称信息学奥赛&#xff09;以其独特的魅力吸引了大量热爱编程的青少年参与。这项赛事不仅考察参赛者的编程技能&#xff0c;更注重逻辑思维能力、问题解决能力和创新能力的培养。通过参加信息学奥赛&#xff0c;孩子们能够在…

OpenGL 入门(九)—Material(材质)和 光照贴图

文章目录 材质设置材质光的属性脚本实现 光照贴图漫反射贴图高光反射贴图 材质 材质本质是一个数据集&#xff0c;主要功能就是给渲染器提供数据和光照算法。 如果我们想要在OpenGL中模拟多种类型的物体&#xff0c;我们必须针对每种表面定义不同的材质(Material)属性。 我们…

设计模式1-访问者模式

访问者模式是一种行为设计模式&#xff0c;它允许你定义在对象结构中的元素上进行操作的新操作&#xff0c;而无需修改这些元素的类。这种模式的主要思想是将算法与元素的结构分离开&#xff0c;使得可以在不修改元素结构的情况下定义新的操作。 所谓算法与元素结构分离&#x…

不会PS怎么抠图?分享几个电商抠图的方法

在工作中&#xff0c;物品抠图是一项常见的任务。为了更好地展示物品&#xff0c;需要将其从背景中抠出来&#xff0c;以便与其他元素进行组合或展示。但是&#xff0c;手动抠图不仅费时费力&#xff0c;而且效果往往不尽如人意。这时&#xff0c;一款强大的物品抠图软件就成为…

【数据结构与算法】(10)基础数据结构 之 堆 建堆及堆排序 详细代码示例讲解

目录 2.9 堆建堆习题E01. 堆排序E02. 数组中第K大元素-Leetcode 215E03. 数据流中第K大元素-Leetcode 703E04. 数据流的中位数-Leetcode 295 2.9 堆 以大顶堆为例&#xff0c;相对于之前的优先级队列&#xff0c;增加了堆化等方法 public class MaxHeap {int[] array;int siz…

【已解决】Oracle 12541 TNS 无监听程序

目录 1、找到Oracle监听服务&#xff08;OracleOraDb10g_homeTNLListener&#xff09;&#xff0c;停止运行 2、首先查看监听文件是否超过4G 3、修改配置文件 连接oracle突然报错&#xff0c;提示Oracle 12541 TNS 无监听程序&#xff0c;可以按照以下步骤解决 1、找到Ora…

【前沿技术杂谈:深度学习新纪元】探索人工智能领域的革命性进展

【前沿技术杂谈&#xff1a;深度学习新纪元】探索人工智能领域的革命性进展 深度学习的进展深度学习的基本原理和算法深度学习的历史发展神经网络的基本构成神经元层次结构激活函数 关键技术和算法反向传播算法卷积神经网络&#xff08;CNN&#xff09;循环神经网络&#xff08…

【操作系统·考研】I/O管理概述

1.I/O设备 1.1 块设备 信息交换以数据块为单位&#xff0c;它属于有结构设备。 块设备传输速率较高&#xff0c;可寻址&#xff0c;且可对该设备随机地的读写。 栗子&#x1f330;&#xff1a;磁盘。 1.2 字符设备 信息交换以字符为单位&#xff0c;属于无结构类型。 字符…

扩展鸿蒙textinput组件

扩展鸿蒙textinput组件&#xff0c;支持快速扩展展性&#xff0c;标题文本等&#xff0c;文本内容双向绑定、文本组件快速复用。 组件代码 /*** 单选文本*/ Component export default struct DiygwInput{//绑定的值Link value:string;//未选中图标State labelImg: Resource …

《热辣滚烫》预售狂潮来袭,贾玲、马丽、杨紫三大女神联袂出演。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 《热辣滚烫》预售票房一日破1300万&#xff0c;燃爆春节档&am…

自定义Dockerfile构建运行springboot

自定义Dockerfile构建运行springboot 通过dockerfile生成自定义nginx镜像 &#xff01;&#xff01;&#xff01;docker 必须在linux环境下才能进行如果你是window则需要装虚拟机 新建一个文件名字为Dockerfile&#xff0c;无需后缀 文件完整名就是Dockerfile,也可以自定义d…

有向图的拓扑排序-BFS求解

题目 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环。 请输出任意一个该有向图的拓扑序列&#xff0c;如果拓扑序列不存在&#xff0c;则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y)&#xff0c;x在A中都出现在y之前&#xff0c;则称…

linux中的makefile

(码字不易&#xff0c;关注一下吧w~~w&#xff09; makefile文件是用来管理项目文件&#xff0c;通过执行make命令&#xff0c;make就会解析并执行makefile文件。 命名&#xff1a;makefile或者Makefile 规则&#xff1a; 目标文件&#xff1a;依赖文件 &#xff08;tab)命…

Narrative Visualization: Telling Stories with Data

作者&#xff1a;Edward Segel、Jeffrey Heer 发表&#xff1a;TVCG&#xff0c; 机构&#xff1a;UW Interactive Data Lab 【原斯坦福可视化组】 1.概述 静态可视化&#xff1a;在一大串的文本描述中&#xff0c;可视化作为提供证据和细节的图表出现新兴可视化&#xff1a…

设计模式学习笔记(一):基本概念;UML

文章目录 参考面向对象的设计原则创建型模式结构型模式行为型模式 UML视图图&#xff08;Diagram&#xff09;模型元素(Model Element)通用机制类之间的关系关联关系复杂&#xff01;&#xff01;聚合关系组合关系 依赖关系泛化关系接口与实现关系 参考 https://github.com/fa…

ubuntu开机报错/dev/nume0n1p2:clean

本来是开机卡在这个界面&#xff0c;经过以下操作&#xff0c;变成这种了 现在的问题变成linux卡在 failed to start NVIDIA Persistence Daemon 按照下面的操作方法&#xff0c;可以有开机界面了。但是输入密码后&#xff0c;一直在登录界面 1.方式一&#xff1a;重新安装显…

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&…

Python爬虫实战 | 京东平台电商API接口采集京东商品京东工业商品详情数据

item_get-获得JD商品详情API测试 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cac…

C++多线程学习[六]: 多线程之间的同步

一、同步问题 实际开发场景中有很多需要同步的情况&#xff0c;例如&#xff0c;音频和视频的同步输出、或者通讯能够第一时间同步接受处理… 二、多线程同步demo 可以看到cond可以阻塞等待&#xff08;wait&#xff09;可以通知一个线程(notify_one)也可以通知所有的线程&am…