LeetCode 热题 100 | 链表(中下)

目录

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.hqwc.cn/news/451393.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

堪称灾难级攻击的 UDP FLOOD洪水攻击,应该如何防护?

DDOS又称为分布式拒绝服务&#xff0c;全称是Distributed Denial of Service。DDOS本是利用合理的请求造成资源过载&#xff0c;导致服务不可用&#xff0c;从而造成服务器拒绝正常流量服务。就如酒店里的房间是有固定的数量的&#xff0c;比如一个酒店有50个房间&#xff0c;当…

列式数据库、行式数据库简介

列式数据库、行式数据库简介 1、数据准备2、行式数据库3、列式数据库4、行式、列式存储对比 常见的行式数据库有Mysql&#xff0c;DB2&#xff0c;Oracle&#xff0c;Sql-server等&#xff1b;列数据库&#xff08;Column-Based&#xff09;数据存储方式按列存储&#xff0c;常…

ESU毅速丨3D打印技术引领模具制造创新革命

随着科技的飞速发展&#xff0c;3D打印技术已经成为制造业的新宠。而在模具制造领域&#xff0c;3D打印技术更是带来了巨大的创新价值&#xff0c;引领着模具制造的革命性变革。 传统模具制造过程中&#xff0c;需要经过多道繁琐工序&#xff0c;而3D打印技术简化了这一过程。3…

MySQL进阶45讲【13】为什么表数据删掉一半,表文件大小不变?

1 前言 有些小伙伴在删数据库数据时&#xff0c;会产生一个疑问&#xff0c;我的数据库占用空间大&#xff0c;我把一个最大的表删掉了一半的数据&#xff0c;怎么表文件的大小还是没变&#xff1f; 那么这篇文章&#xff0c;就介绍一下数据库表的空间回收&#xff0c;看看如…

【实证分析】地级市-资本存量测算结果数据集(含计算公式及原始数据)( 2003-2021年)

该数据为地级市资本存量测算&#xff08;2003-2021年&#xff09;&#xff0c;提供了中国地级市在该期间内资本存量的详细测算结果&#xff0c;包括两种基于2011年和2006年基期的测算方式。该数据集利用了从城市统计年鉴和中国统计年鉴获取的固定资产投资数据及其增速&#xff…

【React】react组件传参、redux状态管理

【React】react组件传参、redux状态管理 一、props&#xff1a;父组件向子组件传参1、将普通的参数作为props传递2、将jsx作为props传递&#xff08;组件插槽&#xff09;&#xff08;1&#xff09;基础功能示例&#xff08;2&#xff09;进阶示例 二、自定义事件&#xff1a;子…

geoserver发布tif影像,关于黑边的问题

一、tif格式 支持发布GeoTIFF格式的发布的tif格式&#xff0c;无法去除tif的黑边发布的tif格式文件不能过大 二、ImageMosaic 可以发布比较大的tif文件可以去除黑边 设置后图层&#xff0c;进行访问就发现没有黑边了 三、可以直接到图层模块&#xff0c;通过图层名称进入图层…

批量注册与自动下单:探索速卖通跨境智能系统的操作方法

速卖通跨境智能系统是一款功能强大的软件&#xff0c;可以帮助用户批量注册速卖通买家号、绑定地址、加购加心愿单以及自动下单等任务。 该软件具有以下优势&#xff1a; 强大的指纹系统&#xff1a;采用最新的反指纹技术&#xff0c;可以设置与代理IP相对应的语言和时区&…

何以穿越产业周期?解读蓝思科技2023年增长密码

1月30日晚&#xff0c;蓝思科技发布了2023年业绩预告&#xff0c;2023年预计实现归母净利润29.38亿元-30.60亿元&#xff0c;同比增长20%-25%。 松果财经注意到&#xff0c;蓝思科技通过垂直整合&#xff0c;构筑了更具竞争力的产业链条。一方面&#xff0c;公司打造了包含ODM…

【Transformer 】 Hugging Face手册-推理管道 (04/10)

一、说明 这里是Hugging Face手册第四部分&#xff0c;如何使用推理管道&#xff1b;即使您没有特定模式的经验或不熟悉模型背后的底层代码&#xff0c;您仍然可以使用它们通过 pipeline ()进行推理&#xff01; 二、推理管道 pipeline ()可以轻松使用Hub中的任何模型来推理任…

今日arXiv最热NLP大模型论文:引入噪声,可提升RAG检索效果超30%??

检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;系统的出现&#xff0c;提高了LLMs回答生成的准确性。它分为两个部分:检索与生成。检索即利用检索器从海量文档中检索出与查询最相关或者最相似的段落&#xff0c;而生成则是LLMs针对混…

Blender教程(基础)-面的切割-10

快捷键K切割&#xff0c;菜单选项切割. 一、随意切割 物体在编辑模式下&#xff0c;按键盘K建切割物体。 二、中点切割 先按K键&#xff0c;再按shift键&#xff0c;会自动吸附到每条边的中点进行切割。 三、取消吸附 切割时会自动吸附到顶点或边 关闭快速吸附 按K键再按…