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

news/2025/3/18 1:45:33/

 

目录

法一:遍历链表法

法二、快慢指针法


题述:给定一个头结点为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);elseprintf("链表为空,无法寻找!\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);elseprintf("链表为空,无法寻找!\n");return 0;
}

 


http://www.ppmy.cn/news/74505.html

相关文章

某书最新版X-s(2023/5/23更新)

前不久刚写过xhs的x-s, 前几天听一些小伙伴说又更新了,我二话不说还按原先的逆向思路,直接搜function sign,开始施展补环境大法。。。 一顿无用的折腾,补完后,测试发现死活不成功,这真是离了大谱了。 对比了一下,通过补环境,sign生成的x-s: 浏览器的x-s: 很明显…

类似于ChatGPT的优秀应用notion

notion 是一款流行的笔记应用。不过功能实际远超笔记&#xff0c;官方自己定义是&#xff1a;“将笔记、知识库和任务管理无缝整合的协作平台”。其独特的 block 概念&#xff0c;极大的扩展了笔记文档的作用&#xff0c;一个 block 可以是个数据库、多媒体、超链接、公式等等。…

一、11.C内存分配/堆栈

C内存分配/堆栈 01.C内存分配❤️ #include <stdio.h>const int g_A = 10; //常量区 int g_B = 20; //数据段 static<

基于SSM+JSP的大学生社团管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

档案室漏水检测控制的类型和感应漏水线的规格

一、漏水绳的类型 漏水绳的类型有两种&#xff0c;一种是区域式漏水绳&#xff0c;搭配漏水控制器&#xff0c;对漏水异常秒级反应、报警。但是仅仅是对有漏水的情况进行监控&#xff0c;无法给出具体的位置&#xff0c;还需要工作人员的进一步排查。 还有一种是定位式漏水检…

旅游网站定位规划简介

一、地区性&#xff1a;让此网站成为中国旅游门户&#xff1b; 二、权威性&#xff1a;通过与各协会的合作&#xff0c;定格使此站的行业权威性&#xff1b; 三、包涵的范围&#xff1a;集成了新闻发布管理、网站内容管理、酒店预订管理、旅游线路系统线路管理、会议预 订管理、…

自动化测试的简单认识

1.什么是自动化测试 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 2.常见的WebDriver的API 定位元素常用的是 findelement方法 比…

动态规划之背包模型

文章目录 采药&#xff08;01背包&#xff09;装箱问题&#xff08;01背包&#xff09;宠物小精灵之收服(二维费用01背包&#x1f44d;&#x1f618;)数字组合(01背包)买书&#xff08;完全背包&#xff09;货币系统&#xff08;完全背包&#xff09;货币系统(&#x1f53a;&am…