链表面试OJ题(1)

今天讲解两道链表OJ题目。

1.链表的中间节点 

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 

 

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 

方法1【 双指针】

时间复杂度O(N)

思想:两个指针,faster的速度是slow两倍,则当faster走到结尾时,slow则走到链表中间。

易错:循环条件 

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* middleNode(struct ListNode* head)
{struct ListNode*faster=head;struct ListNode*slow=head;while(faster && faster->next)//条件没想到{faster=faster->next->next;slow=slow->next;}return slow;
}

2.移除链表元素

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

示例 

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

方法1【三指针--无哨兵位】

时间复杂度:O(N)

思想:三个指正,cur负责对比val,tmp负责存储删除元素的下一个元素地址,prve负责存储删除元素的上一个元素地址

易错:

  • 记住prve是cur的前一个元素,那么它从NULL开始
  • 循环条件
  • 记得处理头节点和尾节点
  • 造成野指针的错误❌

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val) 
{struct ListNode*cur=head;struct ListNode*prve=NULL;while(cur){if(cur->val == val){struct ListNode*tmp=cur->next;free(cur);if(prve){prve->next=tmp;}                                   else{head=tmp;}                          cur=tmp;}else{prve=cur;cur=cur->next;}}return head;}

方法2【双指针---无哨兵位】

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val) 
{struct ListNode*newhead=NULL;struct ListNode*tail=NULL;struct ListNode*cur=head;while(cur){if(cur->val != val){if(newhead == NULL){newhead=tail=cur;}else{tail->next=cur;tail=tail->next;}cur=cur->next;}else{struct ListNode*tmp=cur->next;free(cur);cur=tmp;}if(tail){tail->next=NULL;}} return newhead;          
}//❌改进

那有哨兵位怎么写呢?

当然,这道题还可以联系前面顺序表(移除val)。

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

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

相关文章

windows idea本地执行spark sql避坑

本地安装了IDEA,并配置好了相关POM,可以在本机使用sparkSession连接数据,并在数据库执行sql,在idea展示执行结果。 但是,如果将数据的查询结果建立到spark中,再展示,就会报错 Error while run…

Chromebook文件夹应用新功能

种种迹象表明 Google 旗下的 Chromebooks 近期要有大动作了。根据 Google 团队成员透露,公司计划在 Chrome OS 的资源管理器中新增“Recents”(最近使用)文件,以便于用户更快找到所需要的文件。 种种迹象表明 Google 旗下的 Chro…

RabbitMQ消息可靠性投递

RabbitMQ消息投递的路径为: 生产者 —> 交换机 —> 队列 —> 消费者 在RabbitMQ工作的过程中,每个环节消息都可能传递失败,那么RabbitMQ是如何监听消息是否成功投递的呢? 确认模式(confirm)可以监…

【实战-08】flink 消费kafka自定义序列化

目的 让从kafka消费出来的数据&#xff0c;直接就转换成我们的对象 mvn pom <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information …

mysql 问题解答 2

3 存储 3.1 存储引擎 3、InnoDB 的四大特性? InnoDB 是 MySQL 数据库中最常用的存储引擎之一,它的四大特性通常指的是: ACID 兼容性: 原子性 (Atomicity): 保证事务内的操作要么全部成功,要么全部失败,不会出现中间状态。例如,银行转账操作,从一个账户向另一个账户转…

前端uniapp提交表单调用接口方法最新

目录 源码1源码2最后 源码1 <template><view class"my-add-bank-card"><!-- name"bank_name" form表单提交的input里面一定要加name绑定要传的参数 name"bank_name" type"text" v-model"address.bank_name"…

flink的起源、概念、特点、应用

flink的起源 Flink的起源可以追溯到2010年&#xff0c;当时它作为一个研究项目开始。该项目最初由德国柏林工业大学&#xff08;Berlin Institute of Technology&#xff09;的一群研究人员发起&#xff0c;包括Matei Zaharia、Kostas Tzoumas和Stephan Ewen等。 项目最初被称为…

【系统集成项目管理工程师】——6.习题一

1.&#xff08;&#xff09; 通过独立的、对网络行为和主机操作提供全面与忠实的记录&#xff0c;方便用户分析与审查事故原因&#xff0c;很像飞机上的黑匣子 A、防火墙&#xff1b;B、扫描器&#xff1b;C、防毒软件&#xff1b;D、安全审计系统 答案&#xff1a;D 2.《GB/…

【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

排序算法总结 前言[ 一 ] 小数据基本排序算法&#xff08;1&#xff09;冒泡排序&#xff08;2&#xff09;直接插入排序 [ 二 ] &#xff08;由基本排序衍生的用作&#xff09;处理大数据处理排序&#xff08;1&#xff09;堆排序&#xff08;2&#xff09;希尔排序 [ 三 ] 大…

unity中移动方案--物理渲染分层

一、三种基本移动方案 unity中的移动分为Transform和Rigidbody以及CharacterController&#xff0c;其中CharacterController功能完善&#xff0c;已经可以避免了穿墙&#xff0c;并实现了贴墙走等情况&#xff0c;需要结合性能考虑选择不同的方式。 1.使用transform,直接修改…

鳄鱼指标的3颜色线都代表什么?澳福官网一段话明白了

投资者一直在使用鳄鱼指标进行交易&#xff0c;但是对指标上面的3种颜色的K线都代表什么不明白&#xff1f;直到看到澳福官网一段话才明白&#xff0c;原来这么简单&#xff01; 鳄鱼指标&#xff0c;这一工具是由三条移动平均线组合而成。具体来说&#xff0c;蓝线&#xff0…

mybatis动态表名

1.基于mybatis官方文档 Configuration public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();DynamicTableNameInnerInterceptor dynamicTableNameInnerIntercep…

(算法题)最多约数问题

最多约数问题 正整数x的约数是能整除x的正整数。正整数x 的约数个数记为div(x)。例如&#xff0c;1&#xff0c;2&#xff0c;5&#xff0c;10 都是正整数10 的约数&#xff0c;且div(10)4。设a 和b 是2 个正整数&#xff0c;a≤b&#xff0c;找出a和b之间约数个数最多的数x及其…

Spring Boot 3系列之-启动类详解

Spring Boot是一个功能强大、灵活且易于使用的框架&#xff0c;它极大地简化了Spring应用程序的开发和部署流程&#xff0c;使得开发人员能够更专注于业务逻辑的实现。在我们的Spring Boot 3系列之一&#xff08;初始化项目&#xff09;文章中&#xff0c;我们使用了Spring官方…

高效开发之:封装抛异常工具类

一、首先自定义个错误码枚举类 public enum ErrorCode {SUCCESS(0, "ok"),PARAMS_ERROR(40000, "请求参数错误"),NOT_LOGIN_ERROR(40100, "未登录"),NO_AUTH_ERROR(40101, "无权限"),NOT_FOUND_ERROR(40400, "请求数据不存在&qu…

MVC、MVP、MVI、MVVM、MVVM-C和VIPER等

以下是最重要的架构模式列表&#xff1a; 1、MVC(Model-View-Controller)&#xff1a; 它是最早被采用的设计模式之一。其主要目标是将应用程序的数据、用户界面和控制逻辑分离成三个相互关联的组件。 在这里&#xff0c;模型Model管理数据和逻辑&#xff0c;视图View显示信息…

桶装水订水系统水厂送水小程序开发;

桶装水小程序正式上线&#xff0c;支持多种商品展示形式&#xff0c;会员卡、积分、分销等功能&#xff1b; 开发订水送水小程序系统&#xff0c;基于用户、员工、商品、订单、配送站和售后管理模块&#xff0c;对每个模块进行统计分析&#xff0c;简化了分配过程&#xff0c;提…

C语言-------------#与##运算符使用分析

#运算符 1、#运算符用于在预编译期将宏参数转换为字符串 #include <stdio.h>#define message(X) #X#define CALL(f,p) (printf("This is fuction %s\n",#f),f(p))int square (int n) {return n*n; }int main() {printf("%s\r\n",message(hello…

【教3妹学编程-算法题】最大单词长度乘积

3妹&#xff1a;哇&#xff0c;今天好冷啊&#xff0c; 不想上班。 2哥&#xff1a;今天气温比昨天低8度&#xff0c;3妹要空厚一点啊。 3妹 : 嗯&#xff0c; 赶紧把我的羽绒服找出来穿上&#xff01; 2哥&#xff1a;哈哈&#xff0c;那倒还不至于&#xff0c; 不过气温骤降&…

【简朴PlainApp】通过浏览器就能管理手机文件的开源利器

简朴PlainApp 简朴是一个开源应用&#xff0c;允许您通过网络浏览器管理您的手机。您可以通过安全、易于使用的网络界面从桌面访问文件、视频、音乐、联系人、短信、通话记录等等&#xff01; 这对于手机上文件较多的朋友来说&#xff0c;从任意电脑上管理手机文件的需求还是挺…