LeetCode——链表(Java)

链表

  • 简介
  • [简单] 203. 移除链表元素
  • [中等] 707. 设计链表
  • [简单] 206. 反转链表
  • [简单] 24. 两两交换链表中的节点
  • [简单] 19. 删除链表的倒数第 N 个结点

简介

记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路,如果有错误,可以在评论区提醒一下。

[简单] 203. 移除链表元素

原题链接
一前一后两个指针做遍历操作,记得 开头对空链表做判断,结尾对head是否需要删除做判断

class Solution {public ListNode removeElements(ListNode head, int val) {if (head == null) {return head;}ListNode before = head; // 标记删除元素前一个元素ListNode del = head.next; // 标记删除元素while(del != null){// 删除if(del.val == val) {before.next = del.next;del = before.next;}else{// 前进before = del;del = del.next;}}if(head.val == val) return head.next;return head;}
}

[中等] 707. 设计链表

原题链接
根据平时写Java工程的习惯加入了length属性记录链表长度,方便做过界判断。
链表设计上默认有一个虚的头结点,不计算长度,方便做插入和删除操作。

class MyLinkedList {//考虑存在虚的头结点MyLinkedList next;int val;//维护一个私有变量length表示长度//方便查找时做越界判断private int length;public MyLinkedList() {}public int get(int index) {if(index > length - 1) return -1;int count = index;MyLinkedList pointer = this.next;while(count != 0){pointer = pointer.next;count--;}return pointer.val;}public void addAtHead(int val) {MyLinkedList newHead = new MyLinkedList();newHead.val = val;newHead.next = this.next;this.next = newHead;length++;}public void addAtTail(int val) {MyLinkedList newTail = new MyLinkedList();newTail.val = val;MyLinkedList pointer = this;while(pointer.next != null) pointer = pointer.next;pointer.next = newTail;length++;}public void addAtIndex(int index, int val) {if(index > length) return;else if(index == 0){addAtHead(val);return;}else if(index == length) {addAtTail(val);return;}//以上情况之外,插入的位置都会有前置节点int count = index;MyLinkedList pointer = this.next;while(count > 1){pointer = pointer.next;count--;}MyLinkedList newNode = new MyLinkedList();newNode.val = val;newNode.next = pointer.next;pointer.next = newNode;length++;}public void deleteAtIndex(int index) {//头跟尾分开考虑if(index > length - 1) return;int count = index;MyLinkedList pointer = this;while(count > 0){pointer = pointer.next;count--;}if(pointer.next != null){pointer.next = pointer.next.next;}length--;}public void printList(){System.out.print("[");System.out.print(val);MyLinkedList pointer = this.next;while(pointer != null){System.out.print("," + pointer.val);pointer = pointer.next;}System.out.print("]");System.out.print("    length: " + length);System.out.print("\n");}
}public class main {public static void main(String[] args) {MyLinkedList myLinkedList = new MyLinkedList();myLinkedList.printList();myLinkedList.addAtHead(1);myLinkedList.printList();myLinkedList.addAtTail(3);myLinkedList.printList();myLinkedList.addAtIndex(1, 2);myLinkedList.printList();System.out.println(myLinkedList.get(1));myLinkedList.deleteAtIndex(0);myLinkedList.printList();System.out.println(myLinkedList.get(0));}
}

[简单] 206. 反转链表

原题链接

直接在原链表上挨个改变next指针指向做原地倒置。注意边界情况的判断即可

class Solution {public ListNode reverseList(ListNode head) {if(head == null) return head;ListNode pre = null;ListNode cur = head;ListNode temp = head.next;while(cur != pre){cur.next = pre;pre = cur;if(temp != null) {cur = temp;temp = cur.next;}}return cur;}
}

在有虚头结点的情况下可以做头插法反转,同理这题也可以自己给出一个虚头结点使用头插法反转链表。

class Solution {public ListNode reverseList(ListNode head) {ListNode vHead = new ListNode();vHead.next = null;ListNode cur = head;while(cur != null){ListNode temp = cur.next;cur.next = vHead.next;vHead.next = cur;cur = temp;}return vHead.next;}
}

[简单] 24. 两两交换链表中的节点

原题链接

定义一个虚的头结点方便后续循环操作,因为转换两个节点不只是这两个节点的next需要做处理,两个节点的上一个节点的next也需要重新改变指向,缺少虚头结点的情况下,每次在head上做转换操作的时候不需要操作前置节点,其他情况都需要,就无法统一操作。

class Solution {public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) return head; //长度为0或1直接返回ListNode vHead = new ListNode();vHead.next = head; //设定虚头结点ListNode pre = vHead;ListNode cur = head;while(cur != null && cur.next != null){pre.next = cur.next;cur.next = pre.next.next;pre.next.next = cur;pre = cur;cur = cur.next;}return vHead.next;}
}

[简单] 19. 删除链表的倒数第 N 个结点

原题链接

删除一个节点需要找到他的前置节点,同样设置虚头结点方便操作(没有虚头结点就是多一个对删除第一个元素的判断,因为除了第一个元素之外其他元素都有前置节点需要改变next指针)。使用快慢指针的思路,让前一个指针先走n步,之后两个指针一起前进,第二个指针就会比第一个指针慢n步,就能指向我们需要删除的节点。

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode vHead = new ListNode();vHead.next = head;ListNode node = vHead;ListNode delete = vHead;while(n-- != 0){node = node.next;}while(node.next != null){node = node.next;delete = delete.next;}delete.next = delete.next.next;return vHead.next;}
}

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

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

相关文章

VB生成UTF-8的URL编码

最近在研发股票软件,涉及到URL字符串的处理。贴出以下代码。 Function GBtoUTF8(szInput) Dim wch, uch, szRet Dim x Dim nAsc, nAsc2, nAsc3 如果输入参数为空,则退出函数 If szInput "" Then GBtoUTF8 szInput Exit Function End If 开始…

前、后端程序员开发常用api接口

顺丰速运开放平台:可以查询顺丰速运的快递信息。京东物流开放平台:可以查询京东物流的快递信息。全国快递物流查询:1.提供包括申通、顺丰、圆通、韵达、中通、汇通等600快递公司在内的快递物流单号查询。2.与官网实时同步更新。3.自动识别快递…

【C++】join ()和detach ()函数详解和示例

简单的来说,join ()方法建立的线程具有阻碍作用,该线程不结束,另一些函数就无法运行。detach ()方法建立的线程,可以和另一些函数同时进行。下面以示例进行详细说明,以帮助大家理解和使用。 目录 join ()detach () jo…

PHP使用文件缓存实现html静态化

<?php // 动态生成的内容 $content "<html><body><h1>time:".date("Y-m-d H:i:s")."</h1></body></html>"; // 静态文件保存路径和文件名 $staticFilePath "file.html"; if(file_exists($s…

Ladybug 全景相机, 360°球形成像,带来全方位的视觉体验

360无死角全景照片总能给人带来强烈的视觉震撼&#xff0c;有着大片的既视感。那怎么才能拍出360球形照片呢&#xff1f;它的拍摄原理是通过图片某个点位为中心将图片其他部位螺旋式、旋转式处理&#xff0c;从而达到沉浸式体验的效果。俗话说“工欲善其事&#xff0c;必先利其…

java实现计数排序

图解 计数排序是一种线性时间复杂度的排序算法&#xff0c;它不基于比较排序&#xff0c;而是根据待排序序列中元素的值来进行排序。 具体的过程如下&#xff1a; 统计序列中每个元素出现的个数&#xff0c;得到一个计数数组count。其中&#xff0c;count[i]表示待排序序列中值…

pandas读写json的知识点

pandas对象可以直接转换为json&#xff0c;使用to_json即可。里面的orient参数很重要&#xff0c;可选值为columns,index,records,values,split,table A B C x 1 4 7 y 2 5 8 z 3 6 9 In [236]: dfjo.to_json(orient"columns") Out[236]: {"A":{"x&qu…

Centos 7rc.local脚本命令开机不执行及指定用户启动的方法

1.开机不启动 在实际生产场景中&#xff0c;我们喜欢在安装了一些软件服务后&#xff0c;将软件设置为开机自启动 配置在/etc/rc.local文件中。直接将软件服务的启动命令写在rc.local文件 注意&#xff1a;编辑完rc.local文件后&#xff0c;一定要给rc.local文件执行权限&#…

exit与return的区别 exit(1)、exit(-1)和exit(0)区别

目录 exit(); 是整个程序的结束。 exit(1)、exit(-1)和exit(0)区别 return();是某个函数的结束&#xff0c;并返回结果。 exit和_exit exit(); 是整个程序的结束。 exit&#xff08;0&#xff09;&#xff1a;正常运行程序并退出程序&#xff1b; exit&#xff08;1&am…

AIGC:使用bert_vits2实现栩栩如生的个性化语音克隆

1 VITS2模型 1.1 摘要 单阶段文本到语音模型最近被积极研究&#xff0c;其结果优于两阶段管道系统。以往的单阶段模型虽然取得了较大的进展&#xff0c;但在间歇性非自然性、计算效率、对音素转换依赖性强等方面仍有改进的空间。本文提出VITS2&#xff0c;一种单阶段的文本到…

Xilinx Kintex7中端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优缺点4、详细设计方案设计原理框图OV5640及其配置权电阻硬件方案MIPI CSI-2 RX SubsystemSensor Demosaic图像格式转换Gammer LUT伽马校正VDMA图像缓存AXI4-Stream toVideo OutHDMI输出 5、…

Java安全架构 JCA、JCE、JSSE、JAAS

Java语言拥有三大特征&#xff1a;平台无关性、网络移动性和安全性&#xff0c;而Java安全体系结构对这三大特征提供了强大的支持和保证&#xff0c; Java安全体系结构总共分为4个部分&#xff1a; &#xff08;1&#xff09;JCA&#xff08; Java Cryptography Architecture…

工具及方法 - 手机扫条码工具: SCANDIT APP

一般扫个链接使用微信扫一扫即可。扫具体条码&#xff0c;可以在微信里搜索小程序&#xff0c;打开也能扫&#xff0c;得到条码内容。 还有其他方式&#xff0c;比如使用淘宝、百度等APP也可以直接扫码条码&#xff0c;还能得到更多的信息。 使用百度的话&#xff0c;不扫条码…

【洛谷算法题】P5711-闰年判断【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5711-闰年判断【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…

诡异的bug之dlopen

序 本文给大家分享一个比较诡异的bug&#xff0c;是关于dlopen的&#xff0c;我大致罗列了我项目中使用代码方式及结构&#xff0c;更好的复现这个问题&#xff0c;也帮助大家进一步理解dlopen. 问题复现 以下是项目代码的文件结构&#xff1a; # tree . ├── file1 │ …

2023-11-15 LeetCode每日一题(K 个元素的最大和)

2023-11-15每日一题 一、题目编号 2656. K 个元素的最大和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。将选中…

【已解决】ModuleNotFoundError: No module named ‘timm‘

问题描述 Traceback (most recent call last): File "main.py", line 48, in <module> import utils File "/media/visionx/monica/project/stable_signature/hidden/utils.py", line 26, in <module> import timm ModuleNotFound…

C语言从入门到精通之【概述】

#include指令和头文件 例如#include <stdio.h>&#xff0c;我们经常看到C文件最上面会有类似这样的语句&#xff0c;它的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上&#xff0c;这是一种“拷贝-粘贴”的操作。 #include这行代码是一条C预处理器…

STM32中使用看门狗实现系统自动复位

STM32中的看门狗(Watchdog)是一种用于监控系统运行状态并在系统故障或死锁时执行自动复位的硬件功能。在本文中&#xff0c;我将介绍如何在STM32微控制器中使用看门狗来实现系统的自动复位。下面是详细的解释&#xff1a; 一、看门狗原理简介 看门狗是一种独立的硬件计时器&am…

DNA甲基化的相关知识

目录 1. DNA甲基化简介 2. 原理 3. 酶分类 4. DNA甲基化类型 5.机制 6. 十大DNA甲基化研究核心问题 6.1 植物中的甲基化 6.2 植物中DNA甲基化的主要功能 6.3 DNA甲基化作为生物标志物的潜力 6.4 DNA甲基化检测方法 1. DNA甲基化简介 DNA甲基化&#xff08;DNA methy…