当前位置: 首页 > news >正文

leetCode- - - 链表

目录

1.反转链表(leetcode206)

2. 链表内指定区间反转(leetcode92)

3.链表中的节点每k个一组翻转(leetcode25)

4.合并两个排序的链表(leetcode21)

5.链表的中间节点(leetcode876)

6.重排链表(leetcode143)

7.旋转链表(leetcode61)

8.删除排序链表中的重复元素(leetcode83)

9.删除排序链表中的重复元素(LeetCode 82)(迭代版)

10.环形链表 II ( LeetCode 142 )

11.回文链表( LeetCode 234 )

12.相交链表( LeetCode 160 )

13.奇偶链表( LeetCode 328 )

14.移除链表元素( LeetCode 203 )

15.链表题目做题总结


1.反转链表(leetcode206)

import java.util.*;/** public class ListNode {*   int val;*   ListNode next = null;*   public ListNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param head ListNode类 * @return ListNode类*/public ListNode ReverseList (ListNode head) {// write code hereListNode prev=null;ListNode cur=head;if(head==null){return null;}if(head.next==null){return head;}while(cur!=null){ListNode temp=cur.next;cur.next=prev;prev=cur;cur=temp;}return prev;}
}

2. 链表内指定区间反转(leetcode92)

import java.util.*;/** public class ListNode {*   int val;*   ListNode next = null;*   public ListNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类*/public ListNode reverseBetween (ListNode head, int m, int n) {// write code hereListNode dummy=new ListNode(0);dummy.next=head;ListNode prev=dummy;for(int i=0;i<m-1;i++){prev=prev.next;}ListNode cur=prev.next;for(int i=0;i<n-m;i++){ListNode temp=cur.next;cur.next=temp.next;temp.next=prev.next;prev.next=temp;}return dummy.next;}
}

3.链表中的节点每k个一组翻转(leetcode25)

public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param head ListNode类* @param k int整型* @return ListNode类*/public ListNode reverseKeyGroup (ListNode head, int k) {// write code hereListNode tail=head;//1.递归结束的点for (int i = 0; i < k; i++) {if(tail==null){return head;}tail=tail.next;}//2.完成每k个元素内的翻转ListNode prev=null;ListNode cur=head;while (cur!=tail){ListNode temp=cur.next;cur.next=prev;prev=cur;cur=temp;}head.next=reverseKeyGroup(tail,k);return prev;}
}

4.合并两个排序的链表(leetcode21)

import java.util.*;/** public class ListNode {*   int val;*   ListNode next = null;*   public ListNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类*/public ListNode Merge (ListNode pHead1, ListNode pHead2) {// write code hereListNode dummy =new ListNode(-1);ListNode prev=dummy;while(pHead1!=null && pHead2!=null){if(pHead1.val<pHead2.val){prev.next=pHead1;pHead1=pHead1.next;prev=prev.next;}else{prev.next=pHead2;pHead2=pHead2.next;prev=prev.next;}}if(pHead1!=null){prev.next=pHead1;}if(pHead2!=null){prev.next=pHead2;}return dummy.next;}
}

5.链表的中间节点(leetcode876)

解题:快慢指针

class Solution {public ListNode middleNode(ListNode head) {ListNode fast=head;ListNode slow=head;while(fast!=null && fast.next!=null){slow=slow.next;fast=fast.next.next;}return slow;}
}

6.重排链表(leetcode143)

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public void reorderList(ListNode head) {//1.快慢指针找到中间节点,分成左右两个链表ListNode leftHead=head;ListNode mid=midNode(head);ListNode rightHead=mid.next;//断开左右两个链表mid.next=null;//2.反转右边的链表rightHead=reverse(rightHead);//3.交错合并左右链表while(leftHead!=null && rightHead!=null){ListNode leftHeadNext=leftHead.next;ListNode rightHeadNext=rightHead.next;leftHead.next=rightHead;leftHead=leftHeadNext;rightHead.next=leftHead;rightHead=rightHeadNext;}}public ListNode midNode(ListNode head){ListNode slow=head;ListNode fast=head;while(fast!=null && fast.next!=null){fast=fast.next.next;slow=slow.next;}return slow;}public ListNode reverse(ListNode head){ListNode prev=null;ListNode cur=head;if(head==null){return null;}if(head.next==null){return head;}while(cur!=null){ListNode temp=cur.next;cur.next=prev;prev=cur;cur=temp;}return prev;}
}

7.旋转链表(leetcode61)

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode rotateRight(ListNode head, int k) {if(head==null || k==0){return head;}//计算出链表的长度,当k非常大时,走k步等于走k%len步ListNode cur=head;int len=0;while(cur!=null){len+=1;cur=cur.next;}k=k%len;//former指针先走k步ListNode former=head;ListNode later=head;for(int i=0;i<k;i++){former=former.next;}while(former.next!=null){former=former.next;later=later.next;}former.next=head;ListNode newHead=later.next;later.next=null;return newHead;}
}

8.删除排序链表中的重复元素(leetcode83)

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

class Solution {public ListNode deleteDuplicates(ListNode head) {ListNode cur=head;if(head==null || head.next==null){return head;}while(cur!=null && cur.next!=null){if(cur.val==cur.next.val){cur.next=cur.next.next;}else{cur=cur.next;}}return head;}

9.删除排序链表中的重复元素(LeetCode 82)(迭代版)

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

也可以使用递归的方式,个人认为迭代的方式更容易理解。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode deleteDuplicates(ListNode head) {ListNode dummy=new ListNode(-1);dummy.next=head;ListNode cur=dummy;while(cur.next!=null && cur.next.next!=null){if(cur.next.val==cur.next.next.val){int value=cur.next.val;while(cur.next!=null && cur.next.val==value){cur.next=cur.next.next;}}else{cur=cur.next;}}return dummy.next;}
}

10.环形链表 II ( LeetCode 142 )

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast=head;ListNode slow=head;while(fast!=null && fast.next!=null){fast=fast.next.next;slow=slow.next;if(fast==slow){ListNode b=fast;ListNode a=head;while(a!=b){a=a.next;b=b.next;}return a;}}return null;}
}

11.回文链表( LeetCode 234 )

给你一个单链表的头节点 head ,请你判断该链表是否为

回文链表

。如果是,返回 true ;否则,返回 false 。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {if(head.next==null){return true;}if(head.next.next==null){if(head.val==head.next.val){return true;}else{return false;}}//1.找到中间节点ListNode fast=head;ListNode slow=head;while(fast.next!=null && fast.next.next!=null){fast=fast.next.next;slow=slow.next;}//2.分割为两个链表ListNode leftHead=head;ListNode rightHead=slow.next;//3.反转右边链表rightHead= reverse(rightHead);//4.比较左右链表while (rightHead!=null){if(leftHead.val==rightHead.val){leftHead=leftHead.next;rightHead=rightHead.next;}else{return false;}}return true;}public ListNode reverse(ListNode head){ListNode pre=null;ListNode cur=head;while(cur!=null){ListNode temp=cur.next;cur.next=pre;pre=cur;cur=temp;}return pre;}
}

12.相交链表( LeetCode 160 )

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode pa=headA;ListNode pb=headB;if(headA==null || headB==null){return null;}while(pa!=pb){if(pa==null){pa=headB;}else{pa=pa.next;}if(pb==null){pb=headA;}else{pb=pb.next;}}return pa;}
}

13.奇偶链表( LeetCode 328 )

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode oddEvenList(ListNode head) {//链表为空或者只有一个节点,直接返回即可if(head==null || head.next==null){return head;}ListNode odd=head;ListNode even=odd.next;ListNode evenHead=even;while(even!=null && even.next!=null){odd.next=even.next;    odd=odd.next;even.next=odd.next;even=even.next;}odd.next=evenHead;return head;}
}

14.移除链表元素( LeetCode 203 )

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

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeElements(ListNode head, int val) {if(head==null){return null;}ListNode dummy=new ListNode(-1);dummy.next=head;ListNode pre=dummy;ListNode cur=head;while(cur!=null){if(cur.val==val){pre.next=cur.next;}else{pre=cur;}cur=cur.next;}return dummy.next;}
}

15.链表题目做题总结


1.画图理清思路。
2.考虑边界条件:链表问题通常有很多边界条件需要考虑,例如空链表、只有一个节点的链表、链表长度为偶数或奇数等等。
3.双指针技巧

   快慢指针:用于找链表中点、检测环等问题。
   双指针一前一后:用于逆转链表、找倒数第k个节点等问题。
   双指针同向移动:用于合并两个有序链表等问题。
4.递归的应用:
   有些链表问题可以通过递归来简化处理,例如逆转链表、检测回文链表等。
5.注意内存管理:
   如果涉及到链表节点的删除或插入,要确保不会造成内存泄漏或者指针丢失。特别是在删除节点时,要注意处理好被删除节点的前驱和后继节点的指针关系。
6.利用哨兵节点简化操作:
   在一些操作中,使用哨兵节点(dummy node)可以简化边界条件的处理,特别是在涉及头节点操作时特别有效。
 

相关文章:

leetCode- - - 链表

目录 1.反转链表&#xff08;leetcode206&#xff09; 2. 链表内指定区间反转&#xff08;leetcode92&#xff09; 3.链表中的节点每k个一组翻转&#xff08;leetcode25&#xff09; 4.合并两个排序的链表&#xff08;leetcode21&#xff09; 5.链表的中间节点&#xff08…...

Ashok:一款多功能开源网络侦查OSINT工具

关于Ashok Ashok是一款多功能开源网络侦查公开资源情报OSINT工具&#xff0c;该工具可谓是OSINT领域中的瑞士军刀&#xff0c;广大研究人员可以使用该工具轻松完成网络侦查任务。 侦察是渗透测试的第一阶段&#xff0c;这意味着在计划任何实际攻击之前收集信息。因此&#xff…...

没有获取淘宝API的资质怎么获取淘宝数据

淘宝是头部电商平台之一&#xff0c;每个自研商家或电商软件服务商想要开发电商管理功能模板就少不了要对接淘宝API。淘宝API是在淘宝开放平台提供的&#xff0c;自研商家和软件服务商接入淘宝开放平台需要经过一系列审核和申请流程&#xff0c;要求资质和相关资料符合对应的要…...

SQL手工注入

目录 1.判断是否存在sql注入点 1.1我们在地址栏中输入?id1 1.2我们在地址栏中输入?id-- 2.联合查询 2.1首先知道表格有几列&#xff0c;如果报错就是超过列数&#xff0c;如果显示正常就是没有超出列数。 2.2爆出显示位&#xff0c;就是看看表格里面哪一列是在页面显示…...

【SQL】大的国家

目录 题目 分析 代码 题目 World表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | name | varchar | | continent | varchar | | area | int | | population | int | | gdp | bigint | ----…...

8月5日学习笔记 glibc安装与安全用户角色权限

一&#xff0c;glibc安装 https://www.mysql.com/ 官⽹ https://downloads.mysql.com/archives/community/ https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-li nux-glibc2.12-x86_64.tar 安装步骤 1.安装依赖库 [rootlocalhost ~]# yum list installed |g…...

DrissionPage 一个替代selenium的pip --- 一个可以接管正在运行的chrome包

DrissionPage 一个替代selenium的pip包&#xff0c;持续更新 1、加载内容&#xff0c;并接管chrome浏览器 from DrissionPage import ChromiumPage, ChromiumOptions page ChromiumPage(addr_or_opts127.0.0.1:9222) print(page.title)ul page.eles(idform-submit) for i i…...

爬虫入门--了解相关工具

目录 1.爬虫与python 2.第一个爬虫 3.web请求的全过程 3.1服务器渲染 3.2前端JS渲染 4.浏览器工具 4.1Elements 4.2Console 4.3Source 4.4network&#xff08;重点&#xff09; 5.小结 1.爬虫与python 首先我们要知道&#xff0c;爬虫一定要用Python么? 非也~…...

django项目中通用的分页组件

文章目录 分页组件pager组件代码 分页组件 应用分页组件&#xff0c;需要以下两个步骤&#xff1a; 视图函数中&#xff1a;&#xff08;先获取queryset&#xff0c;将request和queryset传入分页组件对象中&#xff0c;得到生成的html标签&#xff09; def customer_list(requ…...

想实现ubuntu搭建sqli-labs靶场

目录 首先前期的nginx和php部署完成​编辑​编辑 Xftp导入sqli-labs 遇到了的问题 它提示我们请检查db-creds.inc 去尝试解决这个问题 尝试修改MySQL root密码 修改db-creds.inc配置 再次尝试依旧失败 思考&#xff1a;会不会是MySQL版本过高的原因 重新下载MySQL5.7.…...

tp8 按日期分组查出数据

1.如果数据库里时间字段都是时间戳,使用mysql中的from_unixtime()函数 field("from_unixtime(create_time,%Y-%m-%d) as time,group_concat(id)")->group(time)->select()2. 如果数据库是普通的日期格式&#xff08;如2024-01-02 01:23:50&#xff09;&#x…...

单例模式(懒汉模式,饿汉模式)

单例的饿汉模式&#xff1a;在主函数未调用之前该单例就已经存在了&#xff0c;所以不存在线程安全的问题。 class Singleton { private: Singleton(){} public:static Singleton s1;static Singleton* GetInstance(){return &s1;}Singleton(const Singleton&) delet…...

【Qt】Item Widgets 多元素控件

Qt中提供的多元素控件有&#xff1a; QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView 上述控件分为Widget和View&#xff0c;其区别如下&#xff1a; 以QTableWidget和QTableView为例 QTableView是基于MVC(Model-View-Controller)设计的控件。QTableView自身…...

sharded_inference_engine:MLXDynamicShardInferenceEngine;step

目录 sharded_inference_engine:MLXDynamicShardInferenceEngine 类属性 方法 __init__(self) async def infer_prompt(self, shard: Shard, prompt: str, inference_state: Optional[str] = None) -> (np.ndarray, str, bool) async def infer_tensor(self, shard: …...

JAVA开发学习-day21

JAVA开发学习-day21 1. 删除表单数据 根据ElementUI的官方组件指南&#xff0c;为表单每列的数据添加删除按钮 <el-table :data"tableData" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…...

Python的安装环境以及应用

1.环境python2&#xff0c;Python 最新安装3.12可以使用源码安装 查看安装包 [rootpython001 ~]# yum list installed | grep epel 3[rootpython001 ~]# yum list installed | grep python [rootpython001 ~]# yum -y install python3 安装python3 查看版本 [root…...

TabLayout使用以及自定义tab标签

<?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tool…...

第二十节、有限状态机和抽象类多态

一、抽象类 挂载到动画器上的就是继承抽象类代码 1、使用onenable周期函数启用 2、在每一个周期函数中对抽象类进行调用 3、隐藏公开的变量...

SQL注入实例(sqli-labs/less-23)

0、初始网页 1、闭合方式判断 闭合符号为单引号&#xff0c;通过测试发现过滤了注释&#xff0c;所以直接闭合 2、确定查询表的列数 确定查询表的列数为3列 ?id1 order by 3 3、确定回显位置 回显位置为第二列和第三列 ?id-1 union select 1,2,3 4、查看当前登录和数据…...

3.Redis数据类型(二)

LIST List 是一个简单的双向链表&#xff0c;支持从两端进行插入和删除操作。 常用命令&#xff1a; lpush/rpush/lrange lpush 插入一个或多个元素到列表的左端。 rpush 插入一个或多个元素到列表的右端。 lrange key start stop 获取元素&#xff08;前闭后闭&#xff0…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...