找到链表的倒数第m个元素

链表中的倒数第m个元素 题目:给定一个单向链表,请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法。“倒数第m个元素”是这样规定的:当m=0时,链表的最后一个元素(尾元素)将被返回。   分析:单链表是只能正向遍历的,并不适合查找倒数第m个元素,如果需要这类操作,在实际 阅读详情

设计一个算法,找到链表的倒数第m个元素,假设最后一个元素为倒数第0个。算法的复杂度为n。

方法一:遍历链表,得到链表的长度,再找到链表的第n-m个元素即可(如果链表的长度知道就直接找第n-m个元素)。

方法二:双指针查找。用两个指针p1、p2,开始都指向头节点。p1先移动,当p1和p2的距离为m时,两个指针一起移动,当p1移动到尾节点时,此时p2指向的节点就是要找的节点。

具体代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct Node 
{
	int data;
	Node* pNext;
}*pNode;

pNode InitNode()
{
	pNode pHead=(pNode)malloc(sizeof(Node));
	pHead->pNext=NULL;
	return pHead;
}

void CreateListNode(pNode pHead,int nodeNum)
{
	pNode pTail=pHead;
	for (int i=0;i<nodeNum;i++)
	{
		pNode pCur=(pNode)malloc(sizeof(Node));
		pCur->data=i+1;
		pTail->pNext=pCur;
		pCur->pNext=NULL;
		pTail=pCur;
	}
}

void ShowNodeData(pNode pHead)
{
	while(pHead->pNext)
	{
		printf("%d\n",pHead->pNext->data);
		pHead=pHead->pNext;
	}
}


//找到链表的第m个元素
int GetTheData(pNode pHead,int m)
{
	int i=0;
	pNode pTail=pHead;
	while (pTail->pNext)
	{
		i++;
		if (i==m)
		{
			return pTail->pNext->data;
		}
		pTail=pTail->pNext;
	}

}

//第一种方法
int GetTheDataByOne(pNode pHead,int m)
{
	int n=0;
	pNode pCur=pHead;
	while (pCur->pNext)
	{
		n++; //先得到链表的长度
		pCur=pCur->pNext;
	}
	return GetTheData(pHead,n-m);
}

//第二种方法
int GetTheDataBySecond(pNode pHead,int m)
{
	pNode pFirst=pHead,pSecond=pHead;
	int instance=0;
	while (pFirst->pNext!=NULL) //p1移动到最后一个节点时,循环结束
	{
		if (instance==m)  
		{
			 pFirst=pFirst->pNext;
			 pSecond=pSecond->pNext;
		}
		else
		{
			pFirst=pFirst->pNext;
			instance++;
		}
	}
	return pSecond->data;
}

int _tmain(int argc, _TCHAR* argv[])
{
	Node*pHead=InitNode();
	CreateListNode(pHead,8);
	ShowNodeData(pHead);
	printf("输入倒数第几个元素");
	int iNum=0;
	scanf("%d",&iNum);
	printf("方法一的结果是:%d\n",GetTheDataByOne(pHead,iNum));
	printf("方法二的结果是:%d\n",GetTheDataBySecond(pHead,iNum));
	return 0;
}




习题3.5 求链表的倒数第m个元素 (20分) 请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0)个元素。 函数接口定义: ElementType Find( List L, int m ); L是给定的带头结点的单链表;函数Find要将L的倒数第m个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR。 裁判测试程序样例: #include <stdio.h&... 阅读详情

相关推荐

从混乱到清晰:用QJsonObject重构你的Qt网络API数据解析层(避坑指南)

本文详细介绍了如何使用QJsonObject重构Qt网络API数据解析层,避免常见的JSON解析陷阱。通过安全解析模式、数据绑定和性能优化技巧,帮助开发者构建高效、健壮的解析逻辑,提升代码可维护性和可读性。特别适用于处理复杂嵌套的JSON响应数据场景。

weixin_29011667的博客 230

求链表的倒数第m个元素

方法一:先遍历一次链表,得到长度N,在从头遍历找到第N-m+1个元素。 ElementType Find( List L, int m ) { PtrToNode p; int n = 0; p = L->Next; while(p) { n++; p = p->Next; } if(m > n)//m的位置不合法 { return ERROR; } int i = 1; P=L; for(; i <= n-m+1

weixin_45454137的博客 2060

[PayPal报错]为遵守国际法规,这笔交易已被拒绝。

PayPal报错解决:为遵守国际法规,这笔交易已被拒绝。

qq_39906413的博客 1万+

6-3 求链表的倒数第m个元素 数据结构实训(c/c++编程题)

其中List/* 存储结点数据 *//* 指向下一个结点的指针 *//* 定义单链表类型 */L是给定的带头结点的单链表;函数Find要将L的倒数第m个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR。

m0_62351105的博客 270

Yolov8-pose关键点检测:训练实战篇 | 手部关键点检测

yolo8-pose实战检测手部关键点并优化。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 3396

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

jacke121的专栏 626

设计一个复杂度为n的算法找到链表倒数第m个元素,最后一个元素假定是倒数第0个...

使用两个指针,每次前进一个元素,第一个指针前进到第m+1个元素的时候,第二个指针开始前进,此时第二个指针指向第1个元素,当第一个指针前进到链表尾的时候,第二个指针指向的元素就是倒数第m个元素...

weixin_33774308的博客 238

AUTOSAR进阶图解==>AUTOSAR_SWS_BSWGeneral

本文详细解析AUTOSAR基础软件(BSW)模块的通用规范,涵盖其分层架构、配置管理、初始化流程和状态转换机制。AUTOSAR采用清晰的分层设计,包括应用层、服务层、ECU抽象层和微控制器抽象层,各层模块通过标准化接口交互。BSW模块配置采用类型化定义,支持预初始化、初始化和后期构建配置。文档还阐述了模块初始化流程中的依赖管理,以及运行时的状态转换与错误处理机制,为汽车电子控制单元的标准化开发提供规范指导。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1127

笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素

设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个. 提示:双指针查找 相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素也仅仅能从头到尾进行查找,在查找的过程中,设定两个指针,当中p指针指向当前訪问的节点,q指针指向p之前的节点,且两者之间相距m个节点,这样,当p指针指向最后一个节点时,那q指针指向的元素就...

weixin_34375233的博客 170

人工智能训练师三级考试大纲深度解读|理论+实操分值分布+六大模块占比

三级人工智能训练师考试分为理论和实操两大模块(各100分,合格线60分)。理论考试包含AI基础(30%)、数据标注(25%)、模型训练(20%)、测试(15%)和系统运维(10%),题型为客观题;实操考核侧重数据标注(40%)、模型测试(35%)和系统运维(25%),采用现场操作形式。复习应优先关注AI基础和数据标注等高分值模块,实操需重点掌握标准流程和结果准确性(占评分70%)。考试要求两模块均达标,理论侧重概念理解,实操强调规范执行与文档完整。

白话机器学习 1093

从零实现深度学习框架——理解正则化(一)

本文介绍解决过拟合与欠拟合的方法——正则化,主要介绍L1和L2正则化。

日积月累,天道酬勤 3394

笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素

设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个. 提示:双指针查找 相对于双向链表来说,单向链表只能从头到尾依次访问链表的各个节点,所以如果要找链表的倒数第m个元素也只能从头到尾进行查找,在查找的过程中,设定两个指针,其中p指针指向当前访问的节点,q指针指向p之前的节点,且两者之间相距m个节点,这样,当p指针指向最后一个节点时,那q指针指向的元素就是倒

laoniu_c的专栏 3586

vLLM 显存泄漏与 OOM 深度排查:从日志到火焰图

系统性地排查 vLLM 运行中的显存泄漏和 OOM 问题,包括 CUDA 内存快照、PyTorch 内存分析器、火焰图工具。

kaixin110a的博客 186

6-4 求链表的倒数第m个元素 (20 分)

请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0)个元素。 函数接口定义: ElementType Find( List L, int m ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ P...

weixin_43301333的博客 2394

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

(PTA函数题)求链表的倒数第m个元素

请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0)个元素。 ElementType Find( List L, int m ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /*

moreerom的博客 3731

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

求链表的倒数第m个元素 (20分) (C语言)

//简单思路:反求出倒数第m个数是正数第几个。 //再从头遍历到倒数第m个数把它找出来 ElementType Find( List L, int m ) { List p; int i,n=0; p=L->Next;//第一个节点 while(p) { n++;//遍历求表长 p=p->Next; } if(m>n) re...

升级打怪 3164

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

寻找单链表倒数第m个元素

对于单链表来说,

icecream0712的专栏 967

6-8 求链表的倒数第m个元素

6-8 求链表的倒数第m个元素 分数 20 作者 DS课程组 单位 浙江大学 请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0)个元素。 函数接口定义: ElementType Find( List L, int m ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /*

z512845的博客 505

只允许遍历链表一遍,定位链表倒数第m个元素

最近一某大公司面试,碰到一算法类笔试题。大致要求为:输出单链表倒数第m个元素,只允许遍历链表一遍。     笔试时,我的想法是:遍历一遍链表,反转单链表,在反转链表的过程中,用一个指针数组保存当前链表指针(指针数组应足够大),倒转后,输出指针数组倒数第m个即可。以下是我的一个大致想法,并在vc上简单的调试通过:      (本人解法): #define MAX_LIST_NODE_CNT 1

铁匠Smith先生的专栏 1580
上一篇: hash算法
下一篇: WPF listbox Style
skyandcode
博客等级 码龄14年 53粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值