【数据结构】--单链表力扣面试题③找链表的中间节点

news2024/11/17 22:22:12

 

目录

法一:遍历链表法

法二、快慢指针法


题述:给定一个头结点为head的非空单链表,返回链表的中间节点。如果有两个中间节点,则返回第二个中间节点。

示例1:

输入:【1,2,3,4,5】

输出:此链表中的节点3(序列化形式【3,4,5】),返回的节点值为3.(测评系统对该节点序列化表述是【3,4,5】)。注意,我们返回了一个ListNode类型的对象ans,这样:ans.val = 3,ans.next.val = 4,ans.next.next.val = 5,以及ans.next.next.next.val = NULL。

题中已给链表的定义和链表头,让你完善middleNode函数


struct listnode
{
    int val;
    struct listnode* next;
};
struct listnode* middleNode(struct listnode* head)

法一:遍历链表法

遍历链表,算出链表长度n。再遍历到n/2。就能求出中间节点,这种方法的时间复杂度为n+n/2 = 3n/2 -> o(n),同样,这种方法对于是空链表的情况也适用,所以无需格外加判断。

#include<stdio.h>
#include<stdlib.h>

struct ListNode
{
	int val;
	struct ListNode* next;
};
struct ListNode* middleNode(struct ListNode* head)
{
	//法一、遍历链表法
	int len = 0;
	struct ListNode* cur = head;
	while (cur)
	{
		len++;
		cur = cur->next;
	}
	cur = head;
	for (int i = 0; i < len / 2; i++)
	{
		cur = cur->next;
	}
	return cur;//对于空链表也同样适用,直接返回NULL
}
int main()
{
	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
	n1->val = 1;
	n2->val = 2;
	n3->val = 3;
	n4->val = 4;
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = NULL;

	struct ListNode* obj = middleNode(n1);
	if (obj)//一定要考虑链表为空的情况是不能打印的,会非法访问内存
		printf("%d\n", obj->val);
	else
		printf("链表为空,无法寻找!\n");

	return 0;
}

法二、快慢指针法

fast(快指针)slow(慢指针),使慢指针一次走一步,快指针一次走两步。那么针对有偶数个结点的链表,fast走到尾节点算终止条件。针对有奇数个结点的链表,fast走到NULL 算终止条件。无论偶数还是奇数个结点的链表,slow最后指向的节点就是中间节点。

注:快慢指针:本质上不说两个指针谁走的快,谁走的慢,而是指谁先走。先走多少步是可以自己设置的,本题就设置fast每次走2步,slow每次走1步。

法二是更优算法,可以实现只遍历链表一次

#include<stdio.h>
#include<stdlib.h>

struct ListNode
{
	int val;
	struct ListNode* next;
};
struct ListNode* middleNode(struct ListNode* head)
{
	//法二、快慢指针法
	struct ListNode* fast, * slow;
	fast = slow = head;//初始条件,快慢指针均为头指针
	while (fast && fast->next)//结束条件会因链表个数是奇偶个而判断条件不同
	{
		slow = slow->next;//慢指针每次走一步
		fast = fast->next->next;//快指针每次走两步
	}
	return slow;
}
int main()
{
	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
	n1->val = 1;
	n2->val = 2;
	n3->val = 3;
	n4->val = 4;
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = NULL;

	struct ListNode* obj = middleNode(n1);
	if (obj)//一定要考虑链表为空的情况是不能打印的,会非法访问内存
		printf("%d\n", obj->val);
	else
		printf("链表为空,无法寻找!\n");

	return 0;
}

 

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

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

相关文章

〖Web全栈开发④〗— HTML基础详讲(超详细)

HTML基础详讲 &#xff08;一&#xff09;HTML基础1.1浏览器发展史1.2浏览器的诞生和发展 &#xff08;二&#xff09; 什么是网页2.1 网站是什么&#xff1f;2.2 什么是网站2.3 网站服务器2.4 总结 &#xff08;三&#xff09;HTML基础3.1 什么是HTML3.2 HTML标签3.3 实例3.4 …

为什么每个C程序都需要一个叫做 main 的函数?

文章目录 1、为什么每个C程序都需要一个叫做main的函数&#xff1f;2、为什么 C 的 main 函数可以通过调用 exit 或者执行一条 return 语句来结束&#xff0c;或者两者都不做&#xff0c;而程序依然可以正确终止&#xff1f; 1、为什么每个C程序都需要一个叫做main的函数&#…

论文阅读记录(1)

这一周读了2021cvpr的《Learning to Filter: Siamese Relation Network for Robust Tracking》。这篇文章的创新点&#xff1a; Relation Detector。关系检测器。关系检测器在本文中以元学习的方式执行&#xff0c;以获得从背景中过滤干扰物的能力。Refinement Module。x细化模…

canal学习-运行canal-adapter源码并记录解决报错问题(包含缺失的jar文件)(一)

运行canal-adapter 1. 下载canal源码1.1 下载源码并安装好环境1.2 查看目录结构 2.项目运行2.1 项目打包2.2 项目打包可能遇到的问题&#xff1a;1.Failure to find com.alibaba.otter:connector.tcp:jar:jar-with-dependencies:1.1.52.com.alibaba.druid.pool.DruidDataSource…

数字信号处理基础(三):FIR滤波器的设计

目录 1. 滤波器1.1 低通滤波器1.2 高通滤波器1.3 带通滤波器1.4 带阻滤波器 2. 完整代码3. 结果图 1. 滤波器 1.1 低通滤波器 低通滤波器需要知道低通截止频率&#xff0c;然后采用以下代码实现 % 低通滤波器设计 fp2*10000; % 低通滤波器截止频率&#x…

安全测试之使用Docker搭建SQL注入安全测试平台sqli-labs

1 搜索镜像 docker search sqli-labs 2 拉取镜像 docker pull acgpiano/sqli-labs 3 创建docker容器 docker run -d --name sqli-labs -p 10012:80 acgpiano/sqli-labs 4 访问测试平台网站 若直接使用虚拟机&#xff0c;则直接通过ip端口号访问若通过配置域名&#xff0…

2023-5-20-各种编译器的全面学习

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

网站投票软件投票链接制作软件投票链接小程序投票程序

近些年来&#xff0c;第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放&#xff0c;更多人选择微信投票小程序平台&#xff0c;因为它有非常大的优势。 1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

LLVM-Clang交叉编译详细教程

文章目录 前言对比GCC与ClangClang交叉编译参数选项安装交叉编译器交叉编译生成二进制文件Target Arch列表Target Triple列表参考文档后话 前言 最近自己写了个C的小项目&#xff0c;想在Windows编译出其他平台的二进制文件的话&#xff0c;只能交叉编译了&#xff0c;于是就选…

性能测试-JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种&#xff0c;它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈&#xff0c;确保能满足业务需求。很多系统都需要做性能测试&#xff0c;如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c;…

深入学习《c语言函数》

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章学习函数。 让我们开启c语言学习之旅吧…

Mybatis管理数据库

快速入门 使用idea工具操作数据库使用Mybatis查询所有用户数据第一步创建springboot工程&#xff0c;数据库表user&#xff0c;实体类User第二步&#xff0c;引入Mybatis的相关依赖&#xff0c;配置Mybatis&#xff08;数据库连接信息&#xff09;第三步&#xff0c;编写sql语句…

Jmeter工具+ant+jenkins实现持续集成

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具&#xff0c;并配置好环境变量&#xff1b;参考&#xff1a; jmeter默认保存的是.jtl格式的文件&#xff0c;要设置一下bin/jmeter.properties,文件内容&#xff0c;保存jmeter.save.saveservice.output_f…

关于华为云负载均衡ELB健康检查显示离线的排查问题及解决办法

由于项目中经常涉及到检修升级操作&#xff0c;在进行检修升级时&#xff0c;服务就需要停止一段时间&#xff0c;检修结束后重启&#xff0c;在此期间相关的功能页面都将无法访问。甲方反馈&#xff0c;需要停止服务的检修工作暂时不予执行。因此&#xff0c;为了不耽误系统的…

低代码搭建制造管理系统,你要知道的哪些事~

随着数字化转型的推进&#xff0c;制造业也逐渐意识到数字化转型的重要性。数字化转型不仅可以提高制造业的效率和品质&#xff0c;还可以降低成本和提高客户满意度。在数字化转型中&#xff0c;低代码搭建制造管理系统是一种比较有效的方式。本文将介绍低代码搭建制造管理系统…

深入篇【C++】类与对象:再谈构造函数之初始化列表与explicit关键字

深入篇【C】类与对象&#xff1a;再谈构造函数之初始化列表与explicit关键字 Ⅰ.再谈构造函数①.构造函数体赋值②.初始化列表赋值【<特性分析>】1.至多性2.特殊成员必在性3.必走性&#xff1a;定义位置4.一致性5.不足性 Ⅱ.explicit关键字①.隐式类型转化②.作用 Ⅰ.再谈…

Spring Cloud Alibaba 集成 sentinel ,sentinel控制台不能检测到服务,但是在命令行配置启动参数就能看到服务

问题背景 Spring Cloud Alibaba 集成 sentinel &#xff0c;sentinel代码写的限流降级的功能都是好的&#xff0c;但是sentinel控制台不能检测到服务&#xff0c;在程序启动时配置JVM启动参数&#xff08;-Dcsp.sentinel.dashboard.serverlocalhost:18080 -Dproject.namename-…

分公司的负责人要如何承担责任

一、分公司的负责人要如何承担责任 1、分公司的负责人不需要承担责任&#xff0c;因为没有法人资格&#xff0c;没有独立的财产权。根据相关法律规定&#xff0c;分公司的债务由总公司承担连带责任&#xff0c;当然可以先由分公司的全部财产承担。 2、法律依据&#xff1a;《…

小白量化《穿云箭集群量化》(9)用指标公式实现miniQMT全自动交易

小白量化《穿云箭集群量化》&#xff08;9&#xff09;用指标公式实现miniQMT全自动交易 在穿云箭量化平台中&#xff0c;支持3中公式源码运行模式&#xff0c;还支持在Python策略中使用仿指标公式源码运行&#xff0c;编写策略。 我们先看如何使用指标公式源码。 #编程_直接使…

【2023秋招】每日一题:P1087-美团3-18真题 + 题目思路 + 所有语言带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…