链表专题-02

链表专题


/*** 链表的节点* @param <E>*/
public class ListNode<E> {public E element;public ListNode<E> next;public ListNode() {}public ListNode(E element) {this.element = element;}public ListNode(E element, ListNode<E> next) {this.element = element;this.next = next;}@Overridepublic String toString() {return "ListNode{" +"element=" + element +", next=" + next +'}';}
}

链表结构

image-20241007203444370


public class MyLinkedList<E> {private ListNode<E> head;public ListNode<E> getHead() {return head;}public void setHead(ListNode<E> head){this.head = head;}public void add(E data) {ListNode<E> newNode = new ListNode<>(data);if (head == null) {head = newNode;return;}ListNode<E> curr = head;while (curr.next != null) curr = curr.next;curr.next = newNode;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();ListNode<E> curr = this.head;while (curr != null) {sb.append(curr.element).append("-->");curr = curr.next;}sb.delete(sb.length() - 3, sb.length());return sb.toString();}
}

经典问题

反转链表II

问题

[力扣92] 92. 反转链表 II - 力扣(LeetCode)

问题描述

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

img

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]
解决方案

定义虚拟头节点dummy, 要操作节点的前一个节点pre(默认为null), 寻找的反转节点的前一个节点first(默认指向dummy节点)

index记录查找到left的步数,tips:left位置从1开始计算,所以我们要寻找的位置应该left-1;

image-20241010160811119

移动first索引查找要操作的元素的前一个节点(节点1)。

image-20241010161036161

记录当前要操作的节点curr,使用curr对要求的节点进行反转操作。

  1. Node next = curr.next;
  2. curr.next = pre;
  3. pre = curr;
  4. curr = next;

image-20241010162218836

image-20241010163514401

重复执行操作2,3,4节点,出循环后

  1. first.next.next = curr; //即节点2 连接节点5
  2. first.next = pre; //即节点1连接要操作的最后一个节点

image-20241010163328626

image-20241010163813255

ListNode<Integer> dummy = new ListNode<>(-1, head);
ListNode<Integer> pre = null;
ListNode<Integer> first = dummy;for (int i = 0; i < left - 1; i++) {first = first.next;
}ListNode<Integer> curr = first.next;for (int i = 0; i <= (right - left); i++) {ListNode<Integer> next = curr.next;curr.next = pre;pre = curr;curr = next;
}first.next.next = curr;
first.next = pre;return dummy.next;

删除链表中中重复元素

问题

[力扣83] 83. 删除排序链表中的重复元素 - 力扣(LeetCode)

问题描述

给定一个已排序的链表的头 head删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表

示例 1:

img

输入:head = [1,1,2]
输出:[1,2]

示例 2:

img

输入:head = [1,1,2,3,3]
输出:[1,2,3]
解决方案

定义要移动的节点curr: curr = head

image-20241010164114608

如果当前curr的值与curr.next的值相等,则断开此节点连接下一个节点(2),否则移动curr索引

if(curr.val == curr.next.val) curr.next = curr.next.next;
else

curr = curr.next;

image-20241010164735796

 public ListNode deleteDuplicates(ListNode head) {ListNode dummy = new ListNode(-1, head);ListNode curr = dummy.next;while (curr.next != null) {if (curr.val == curr.next.val) {curr.next = curr.next.next;} else {curr = curr.next;}}return dummy.next;}

删除链表中节点

问题

[力扣237] 237. 删除链表中的节点 - 力扣(LeetCode)

问题描述

有一个单链表的 head,我们想删除它其中的一个节点 node。给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head

链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:

  • 给定节点的值不应该存在于链表中。
  • 链表中的节点数应该减少 1。
  • node 前面的所有值顺序相同。
  • node 后面的所有值顺序相同。

自定义测试:

  • 对于输入,你应该提供整个链表 head 和要给出的节点 nodenode 不应该是链表的最后一个节点,而应该是链表中的一个实际节点。
  • 我们将构建链表,并将节点传递给你的函数。
  • 输出将是调用你函数后的整个链表。

示例 1:

img
输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9

示例 2:

img
输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9

提示:

  • 链表中节点的数目范围是 [2, 1000]
  • -1000 <= Node.val <= 1000
  • 链表中每个节点的值都是 唯一
  • 需要删除的节点 node链表中的节点 ,且 不是末尾节点
解决方案
image-20241011172032702
 public void deleteNode(ListNode node) {node.val=node.next.val;node.next=node.next.next;}

移除链表元素

问题

[力扣203] 203. 移除链表元素 - 力扣(LeetCode)

问题描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

示例 1:

img

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]
解决方案

递归退出条件 :if(curr.next ==null) return null;

curr.next = null;

image-20241010171054474

判断当前节点是否是要删除的节点,如果是则删除(即断开下一个节点的连接)

if(curr.val == val){

return curr.next;

}else{

return curr;

}

image-20241010171515757

递归操作

image-20241010171612605

public ListNode<Integer> removeElementsx(ListNode<Integer> curr, int val) {if (curr == null) return null;curr.next = removeElementsx(curr.next,val);if(curr.val == val ){return curr.next;}else{return curr;}
}

移除链表元素II

问题

[力扣82] 82. 删除排序链表中的重复元素 II - 力扣(LeetCode)

问题描述

给定一个已排序的链表的头 head删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表

示例 1:

img

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

示例 2:

img

输入:head = [1,1,1,2,3]
输出:[2,3]
解决方案

定义虚拟头结点dummy,操作节点curr指向dummy

image-20241010173217386

移动curr,防止越界 curr.next !=null && curr.next.next!=null,

获取当前节点,使用中间节点tmp记录 ListNode tmp = curr.next;

image-20241011171107180

判断是和相邻的节点是否相等(curr.next.next: 节点2)

if(curr.next.next.val ==val){

//循环删除节点

while(curr.next !=null && curr.next.val == val){

​ curr.next = curr.next.next;

​ }

}

image-20241011171221695


从链表中移除节点

问题

[力扣2487] 2487. 从链表中移除节点 - 力扣(LeetCode)

题目描述

给你一个链表的头节点 head 。移除每个右侧有一个更大数值的节点。返回修改后链表的头节点 head

示例 1:

image-20241011172701905

输入:head = [5,2,13,3,8]
输出:[13,8]
解释:需要移除的节点是 523- 节点 13 在节点 5 右侧。
- 节点 13 在节点 2 右侧。
- 节点 8 在节点 3 右侧。

示例 2:

输入:head = [1,1,1,1]
输出:[1,1,1,1]
解释:每个节点的值都是 1 ,所以没有需要移除的节点。
解决方案

image-20241011173656387


给你一个链表的头节点 head 。移除每个右侧有一个更大数值的节点。返回修改后链表的头节点 head

示例 1:

[外链图片转存中…(img-1wS0djH7-1739015221466)]

输入:head = [5,2,13,3,8]
输出:[13,8]
解释:需要移除的节点是 523- 节点 13 在节点 5 右侧。
- 节点 13 在节点 2 右侧。
- 节点 8 在节点 3 右侧。

示例 2:

输入:head = [1,1,1,1]
输出:[1,1,1,1]
解释:每个节点的值都是 1 ,所以没有需要移除的节点。
解决方案

在这里插入图片描述

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

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

相关文章

外部中断实验 #STM32F407

外部中断实验 此实验将外部中断配置为按键输入&#xff0c;通过按键输入触发外部中断&#xff0c;在外部中断里面实施相应的处理&#xff0c;具体功能&#xff1a; 按下KEY0&#xff0c;翻转LED0状态按下KEY1&#xff0c;翻转LED1状态按下KEY2&#xff0c;同时翻转LED0和LED1…

机器学习8-卷积和卷积核1

机器学习8-卷积和卷积核1 卷积与图像去噪卷积的定义与性质定义性质卷积的原理卷积步骤卷积的示例与应用卷积的优缺点优点缺点 总结 高斯卷积核卷积核尺寸的设置依据任务类型考虑数据特性实验与调优 高斯函数标准差的设置依据平滑需求结合卷积核尺寸实际应用场景 总结 图像噪声与…

SVN 提交与原有文件类型不一样的文件时的操作

SVN 提交与原有文件类型不一样的文件时的操作 背景 SVN 服务器上原本的文件是软链接类型的&#xff0c;但是我将它改成普通文件再上传。出现了以下提示&#xff1a; 解决过程 本来想着通过 svn rm 和 svn add 来解决&#xff0c;但是行不通。 最终解决方案 svn rm --keep-…

阿里云专有云网络架构学习

阿里云专有云网络架构 叶脊&#xff08;spine-leaf&#xff09;网络和传统三层网络拓扑对比 阿里云网络架构V3拓扑角色介绍推荐设备设备组网举例带外管理网络带外网和带内网对比设备介绍 安全网络设备介绍 参考 后续更新流量分析叶脊&#xff08;spine-leaf&#xff09;网络和传…

Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问

1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型&#xff0c;您可以按照以下步骤进行操作&#xff1a; 步骤 1&#xff1a;安装 Ollama 安装 Ollama&#xff1a; 使用以下命令安装 Ollama&#xff1a; curl -sSfL https://ollama.com/download.…

3D数字化营销:重塑家居电商新生态

随着电商的蓬勃发展&#xff0c;网上订购家具已成为众多消费者的首选。然而&#xff0c;线上选购家具的诸多挑战&#xff0c;如风格不匹配、尺寸不合适、定制效果不如预期以及退换货不便等&#xff0c;一直困扰着消费者。为解决这些问题&#xff0c;家居行业急需一种全新的展示…

重塑“景区+商业”模式,打造特色文旅新体验

重塑“景区商业”模式&#xff0c;打造特色文旅新体验 近年来&#xff0c;旅游业蓬勃发展&#xff0c;旅游热潮不断升温&#xff0c;游客消费观念也随之升级。为顺应这一趋势&#xff0c;各大景区纷纷探索打造特色文旅项目&#xff0c;以期吸引更多游客。然而&#xff0c;“景…

在亚马逊云科技上云原生部署DeepSeek-R1模型(下)

在本系列的上篇中&#xff0c;我们介绍了如何通过Amazon Bedrock部署并测试使用了DeepSeek模型。在接下来的下篇中小李哥将继续介绍&#xff0c;如何利用亚马逊的AI模型训练平台SageMaker AI中的&#xff0c;Amazon Sagemaker JumpStart通过脚本轻松一键式部署DeepSeek预训练模…

Kubernetes是什么?为什么它是云原生的基石

从“手工时代”到“自动化工厂” 想象一下&#xff0c;你正在经营一家工厂。在传统模式下&#xff0c;每个工人&#xff08;服务器&#xff09;需要手动组装产品&#xff08;应用&#xff09;&#xff0c;效率低下且容易出错。而Kubernetes&#xff08;k8s&#xff09;就像一个…

Transformer 详解:了解 GPT、BERT 和 T5 背后的模型

目录 什么是 Transformer? Transformer如何工作? Transformer 为何有用? 常见问题解答:机器学习中的 Transformer 在技​​术领域,突破通常来自于修复损坏的东西。制造第一架飞机的人研究过鸟类。莱特兄弟观察了秃鹫如何在气流中保持平衡,意识到稳定性比动力更重要。…

图片webp格式动图图片

这是一个webp动图1 这是一个webp动图2 webp 图像由gif 转换 3

【R语言】plyr包和dplyr包

一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”&#xff08;split-apply-combine&#xff09;策略。此策略是指将一个问题分割成更容易操作的部分&#xff0c;再对每一部分进行独立的操作&#xff0c;最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…

【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析

一、引言与背景 在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;如DeepSeek以其卓越的自然语言理解和生成能力&#xff0c;推动了众多应用场景的发展。然而&#xff0c;大型模型的高昂计算和存储成本&#xff0c;以及潜在的数据隐私风险&#xff0c;限制了…

【AI】在Ubuntu中使用docker对DeepSeek的部署与使用

这篇文章前言是我基于部署好的deepseek-r1:8b模型跑出来的 关于部署DeepSeek的前言与介绍 在当今快速发展的技术环境中&#xff0c;有效地利用机器学习工具来解决问题变得越来越重要。今天&#xff0c;我将引入一个名为DeepSeek 的工具&#xff0c;它作为一种强大的搜索引擎&a…

TCP三次握手全方面详解

文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值&#xff0c;以及acknum的功能(3) 三次握手中的半连接队列&#xff08;SYN队列&#xff09;和全连接队列&#xff08;ACCEPT队列&#xff09;半连接队列全连接队…

数据结构与算法-递归

单路递归 二分查找 /*** 主函数&#xff1a;执行二分查找。* * param a 要搜索的数组&#xff08;必须是已排序的&#xff09;* param target 目标值* return 返回目标值在数组中的索引&#xff1b;如果未找到&#xff0c;则返回 -1*/ public static int binarySearch(int[] …

Termux安装ssh实现电脑ssh

Termux下载 点击下载 在 Termux 中安装并使用 SSH&#xff0c;按照以下步骤操作&#xff1a; 1. 更新软件包列表 pkg update && pkg upgrade2. 安装 OpenSSH pkg install openssh3. 设置 SSH 密码&#xff08;必须&#xff0c;否则无法使用 SSH 服务器&#xff09…

深入理解 C++17 std::is_swappable

文章目录 深入理解 C17 std::is_swappable引言std::is_swappable 概述std::is_swappable 的工作原理std::is_swappable 的变体注意事项结论 深入理解 C17 std::is_swappable 引言 在 C 编程中&#xff0c;交换两个对象的值是一个常见的操作。为了确保代码的通用性和安全性&am…

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上&#xff0c;其内部结构如图4-1所示。作为单一芯片的计算机&#xff0c;它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU&#xff0c;由运算器和控制器两个部分构成&#xff1b;…

w~Transformer~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/12406495 #transformer~x1 太可怕了都到6了 太强~~ DeepMind 表示&#xff0c;他们提出的算法蒸馏&#xff08;AD&#xff09;是首个通过对具有模仿损失的离线数据进行顺序建模以展示上下文强化学习的方法。同时基于观察…