PTA(链表)1-8 求链表的倒数第m个元素(C)
PTA(链表)1-8 求链表的倒数第m个元素(C)
zhangzhang1-8 求链表的倒数第m个元素
分数 5
作者 DS课程组
单位 浙江大学
请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0)个元素。
函数接口定义:
1 | ElementType Find( List L, int m ); |
其中List结构定义如下:
1 | typedef struct Node *PtrToNode; |
L是给定的带头结点的单链表;函数Find要将L的倒数第m个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR。
裁判测试程序样例:
1 |
|
输入样例:
1 | 5 |
输出样例:
1 | 4 |
答案
1 | ElementType Find( List L, int m ) { |
思路
这是典型的双指针(快慢指针)问题,用于查找链表中 “倒数第 m 个节点的值”:
- 快指针先向前移动 m 步
- 快慢指针同时向前移动,直到快指针到达链表末尾
- 此时慢指针指向的就是倒数第 m 个节点,返回其值
易错点
- 空链表或 m=0 处理:未判断
L->Next是否为空(空链表),或 m 为 0 时直接操作,可能导致空指针访问 - m 超出链表长度:快指针移动 m 步前需检查是否提前遇到
NULL,否则会越界 - 头节点处理:若链表带头节点,快慢指针需从
L->Next(第一个数据节点)开始,而非L - 返回值错误:当 m 无效时需返回题目规定的
ERROR(需确保ERROR已定义)



