力扣刷题录——链表

一、移除链表元素

移除链表元素

法一:不使用虚拟头节点

    ListNode* removeElements(ListNode* head, int val) {//若删除头节点while(head!=NULL&&head->val==val)//连续删除头节点的条件{head=head->next;} //删除其他节点(先判断是不是空链表)if(head!=NULL){ListNode* cur=head;while(cur->next!=NULL){if(cur->next->val==val){cur->next=cur->next->next;}else{cur=cur->next;}}}return head;}

法二:使用虚拟头节点

  ListNode* dummy=new ListNode(0,head); //创建虚拟头节点并连接到原链表ListNode* cur=dummy; //用来遍历的指针while(cur->next!=NULL){if(cur->next->val==val){cur->next=cur->next->next;}else{cur=cur->next;}}return dummy->next;

 二、设计链表

设计链表

单链表:

//先定义节点结构体
struct LinkNode{
int val;
LinkNode* next;
LinkNode(int val=0,LinkNode* next=NULL):val(val),next(next){}
};class MyLinkedList {int size; //链表的长度 LinkNode* dummy; //虚拟头节点
public:MyLinkedList() {//初始化链表:长度为0,初始化虚拟头节点size=0;dummy=new LinkNode();}// 析构函数,释放所有节点的内存~MyLinkedList() {LinkNode* cur = dummy;while (cur != nullptr) {LinkNode* temp = cur;cur = cur->next;delete temp; // 不断删除头节点,手动释放内存}}int get(int index) {//先判断index是否合理if(index<0||index>size-1)return -1;else{LinkNode* cur=dummy;int loop=index+1;while(loop--){cur=cur->next;}return cur->val;}}void addAtHead(int val) {//先新建节点LinkNode* newNode=new LinkNode(val);//插入newNode->next=dummy->next;dummy->next=newNode;size++;}void addAtTail(int val) {LinkNode* newNode=new LinkNode(val);LinkNode* cur=dummy;while(cur->next!=NULL){cur=cur->next;}cur->next=newNode;size++;}void addAtIndex(int index, int val) {//先判断index是否合理if(index<0||index>size)return;LinkNode* newNode=new LinkNode(val);LinkNode* cur=dummy;int loop=index;while(loop--){cur=cur->next;}newNode->next=cur->next;cur->next=newNode;size++;}void deleteAtIndex(int index) {//先判断index是否合理if(index<0||index>size-1)return;int loop=index; //让cur指向下标为index-1的节点LinkNode* cur=dummy;while(loop--){cur=cur->next;}cur->next=cur->next->next;size--;}
};/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList* obj = new MyLinkedList();* int param_1 = obj->get(index);* obj->addAtHead(val);* obj->addAtTail(val);* obj->addAtIndex(index,val);* obj->deleteAtIndex(index);*/

三、反转链表 

反转链表

 法一:逐个逆转方向

ListNode* reverseList(ListNode* head) {//法一:逐个逆转方向ListNode*cur=head,*pre=NULL,*temp;while(cur){temp=cur->next; //一存cur->next=pre; //二改pre=cur; //三移cur=temp;}return pre;}

递归写法:

//递归写法ListNode* reverse(ListNode*cur,ListNode*pre){if(cur==NULL) //终止条件return pre; ListNode* temp=cur->next; //先存cur->next=pre; //后改向return reverse(temp,cur); //进入下一轮逆转(将指针移动放进递归参数变化中)}ListNode* reverseList(ListNode* head) {return reverse(head,NULL); //调用递归}

 法二:虚拟头节点+头插法

    ListNode* reverseList(ListNode* head) {//法二:虚拟头节点+头插法ListNode*nummy=new ListNode();ListNode*cur=head,*temp;while(cur){temp=cur->next; //一存cur->next=nummy->next; //二头插nummy->next=cur;cur=temp; //三移}return nummy->next;}

四、两两交换链表中的节点 

两两交换链表中的节点 

法一:

 ListNode* swapPairs(ListNode* head) {//借用虚拟头节点,1+2的模式交换ListNode*dummy=new ListNode(0,head);ListNode*cur=dummy;while(cur->next!=NULL&&cur->next->next!=NULL) //节点数为偶数或奇数时的循环条件(注意cur->next要写在前面,否则可能空指针异常){//交换两个节点ListNode *temp=cur->next;//先保存一个节点,防止丢失(也可以借助两个临时指针存储信息,不容易错乱)cur->next=cur->next->next; //交换节点(三条线)temp->next=cur->next->next;cur->next->next=temp;cur=cur->next->next; //指针移动}return dummy->next;}

法二:递归法

五、删除链表的倒数第N个节点

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

法一:利用快慢指针

    ListNode* removeNthFromEnd(ListNode* head, int n) {//利用快慢指针的差值:n+1步;利用虚拟头指针,统一删除操作ListNode *dummy=new ListNode(0,head);ListNode*fast=dummy,*slow=dummy;//快指针先走n+1步for(int i=0;i<n+1;i++){fast=fast->next;}//快慢指针再同时走,直至fast走到末尾while(fast){slow=slow->next;fast=fast->next;}//删除节点slow->next=slow->next->next;return dummy->next;}

 法二:先计算出链表长度

int getLength(ListNode*head){int length=0;while(head){length++;head=head->next;}return length;}ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode*dummy=new ListNode(0,head); //利用虚拟头节点,统一删除操作ListNode*cur=dummy;//先计算出链表长度int lenght=getLength(head);//再找要删除节点的前一个节点(转换成顺数第几个节点)最后一位:正序lenght,逆序1 所以逆序第n位,对应正序第lenght+1-n位for(int i=0;i<lenght-n;i++) //cur走length-n步到达被删节点的前一个节点{cur=cur->next;}//最后删除节点cur->next=cur->next->next;return dummy->next;}

六、环形链表 

环形链表 

快慢指针:快指针速度为2,慢指针速度为1,若两个指针相遇则说明链表有环

       (快指针比慢指针快即可,但是2:1是最高效的)

双指针:index1从头节点出发,index2从相遇节点出发,则两者的相遇点在入环节点

 ListNode *detectCycle(ListNode *head) {//若快慢指针相遇,则说明有环ListNode*fast=head,*slow=head;while(fast!=NULL&&fast->next!=NULL) //让快慢指针跑起来,结束条件是fast没到末尾(因为fast一下跳两步,所以还要保证fast->next不为空){fast=fast->next->next;slow=slow->next;if(slow==fast) //若相遇,则说明有环{ListNode*index1=head,*index2=fast; //从出发点和相遇点各派出速度同为1的指针,则两者相遇点在入环节点while(index1!=index2) //让两个指针跑起来,结束条件是index1==index2{index1=index1->next;index2=index2->next;}return index1;}}return NULL; //循环结束无环,返回null}

 

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

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

相关文章

【Qt 关于信号和槽 的参数类型和参数顺序关系】

前言&#xff1a;信号的参数类型和参数顺序一定要严格要求并且指明&#xff08;特别是当同一信号会发出不同参数类型和顺序的信号时&#xff09;&#xff0c;槽会根据参数类型和参数顺序进行匹配相应的槽函数&#xff0c;期间槽函数的自动类型匹配也可以生效。 信号定义&#x…

运行ruoyi

nacos 数据库配置 修改nacos/conf/application.properties 单机版运行 startup.cmd -m standalone redis 运行后端 运行gateway,auth,modules/system模块 可能遇到的问题&#xff1a;端口正在使用 解决 netstat -ano | findstr 9200 taskkill -pid 18284 -f

JAVA同城圈子达人交友系统源码支持微信小程序+公众号+H5+APP

&#x1f308; 同城圈子达人交友系统&#xff0c;遇见志同道合的TA&#xff01; &#x1f389; 开篇&#xff1a;告别孤单&#xff0c;同城圈子等你来探索&#xff01; 在这个快节奏的城市生活中&#xff0c;你是否常常感到孤独&#xff0c;渴望找到一群志同道合的朋友&#…

发现洗白的公开伎俩

利益方把事件A和事件B放在一起&#xff0c;事件A和事件B有明显逻辑冲突&#xff0c;故意把A和B在一起炒大。一段时间就有人利用逻辑冲突来故意辟谣&#xff0c;把事件真实全部否定&#xff0c;达到舆论上既没有做A或其相关事项&#xff0c;也没有做B或其相关事项的目的&#xf…

Elasticsearch基础(六):使用Kibana Lens进行数据可视化

文章目录 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 二、基础可视化 1、指标可视化 2、垂直堆积条形图 3、表格 三、高级可视化 1、多图层和索引 2、子桶 3、树状图 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 在Kibana主页&#xff0c;单击页面…

【资料分享】2024钉钉杯大数据挑战赛A题思路解析+代码演示

2024第三届钉钉杯大学生大数据挑战赛今天已经开赛&#xff0c;【A题】思路解析代码&#xff0c;资料预览&#xff1a;

Conda的守护神:包兼容性测试全指南

Conda的守护神&#xff1a;包兼容性测试全指南 在软件开发中&#xff0c;确保不同软件包之间的兼容性是维护项目稳定性的关键。Conda&#xff0c;作为广泛使用的包管理器和环境管理器&#xff0c;提供了强大的工具来测试包的兼容性。本文将深入探讨如何在Conda中使用包兼容性测…

使用 Java 监听和处理 POST 请求

各类学习教程下载合集 ​​https://pan.quark.cn/s/874c74e8040e​​ 在现代 Web 开发中&#xff0c;监听和处理 HTTP POST 请求是常见的任务之一。无论是构建 RESTful API 还是处理表单提交&#xff0c;Java 都提供了强大的工具和库来实现这一功能。本文将介绍如何使用 Java…

【JAVA学习笔记】找不到依赖项 ‘org.springframework.boot:spring-boot-starter-web:3.0.5‘

如果环境都是跟着教程配的话&#xff0c;并且上网搜了一圈询问gpt都没发现对应长得像的错误&#xff0c;那么试试**刷新一下Maven项目**&#xff0c;可能问题就自己解决了。如果这样解决不了再查到底是什么地方没有配置对。&#xff08;我第一次遇到这个问题的时候搜了半天都不…

RHEL8.6配置yum仓库

记录通过Linux安装ISO挂载yum仓库&#xff0c;由于没有在线仓库只能挂载iso的软件仓库 [rootlocalhost /]# yum install libicu 正在更新 Subscription Management 软件仓库。 无法读取客户身份本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。错误&…

遇到 chunk of umi not found 处理办法

1、删除 以下文件 &#xff08;1&#xff09;node_modules 其中快速删除node_modules方法可参考&#xff1a;rimraf快速删除node_modules方法-CSDN博客文章浏览阅读258次。rimraf快速删除node_modules方法https://blog.csdn.net/2401_85955297/article/details/140566245?spm…

md,感觉enable_if的推导过程又迷糊了。这次好像又清晰了一些

通过这几个例子&#xff0c;暂时有个结论&#xff1a; 基本就是&#xff1a;由泛型版本定下参数列表里的参数&#xff0c; 编译成功&#xff1a;template<bool _Test, class _Ty void> struct enable_if123;template<class _Ty> struct enable_if123<true, _T…

微信小游戏之 三消(一)

首先设定一下 单个 方块 cell 类&#xff1a; 类定义和属性 init 方法 用于初始化方块&#xff0c;接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧&#xff0c;并播放闪烁动作&#xff0c;用于显示方块的警告状态。 grow 方法 根据传入的方向…

网络基础之(11)优秀学习资料

网络基础之(11)优秀学习资料 Author&#xff1a;Once Day Date: 2024年7月27日 漫漫长路&#xff0c;有人对你笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的博客-CSDN博客。 参考文档&#xff1a; 网络工程初学者的学习方法及成长之路&#xff08;红…

【视频讲解】后端增删改查接口有什么用?

B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”&#xff0c;其实这句话可以拆解为下面3个问题。 接口是什么意思&#xff1f;后端接口是什么意思&#xff1f;后端接口中的增删改查接口有什么用&#xff1f; 1、接口 概念&#xff1a;接口的概念在不同的领域中…

【QT】QT 系统相关(事件、文件、多线程、网络、音视频)

一、Qt 事件 1、事件介绍 事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制…

追问试面试系列:JVM运行时数据区

hi 欢迎来到追问试面试系列之JVM运行时数据区,在面试中出现频率非常高,并且其中还存在一些误导性的面试,一定要注意。 什么误导性呢?面试中,有的面试官本来是想问JVM运行时数据区,不过提问时难免有些让你觉得很不爽。比如:你说说java内存模型,还比如说说JVM内存模型,…

昇思MindSpore学习入门-静态图高级编程技巧

如何优化编译性能 使用lazy_inline装饰器 神经网络模型的编译过程往往采用默认inline的方式&#xff0c;把层级的代码表达最终展开成一张扁平的计算图&#xff0c;一方面寻求最大的编译优化机会&#xff0c;另一方面也可以简化自动微分以及执行的逻辑。inline后形成的计算图包…

MySQL客户端命令一节将.sql文件导入MySQL

MySql客户端命令 直接输入SQL语句 使用MySQL客户端连接到服务器之后&#xff0c;可以发送SQL语句到服务器执行&#xff0c;并且以&#xff1b;和\g, \G作为结束不同的结束方式显示内容有所不同** TIPS: ;和\g结尾以表格的形式显示结果\G以行的形式显示结果 在连接到服务器之后…

Spring Cloud全解析:精通Spring上下文管理,构建高效微服务架构

springcloud容器 springCloud中不只存在了一个Spring容器&#xff0c;会进行多次创建Spring容器&#xff0c;来形成父子容器 BootStrap上下文&#xff1a;由SpringCloud监听器创建&#xff0c;用来初始化SpringCloud上下文&#xff0c;该容器是祖先容器SpringBoot上下文&…