编者注:考题版权归属版权方,作答代码版权归属编者,请勿私自盗用。本代码仅供参考,还请各位读者不吝赐教。
请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0)个元素。
函数接口定义:
ElementType Find( List L, int m );
其中List结构定义如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L是给定的带头结点的单链表;函数Find要将L的倒数第m个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */
ElementType Find( List L, int m );
int main()
{
List L;
int m;
L = Read();
scanf("%d", &m);
printf("%d\n", Find(L,m));
Print(L);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
5
1 2 4 5 6
3
输出样例:
4
1 2 4 5 6
编者注:考题版权归属版权方,作答代码版权归属编者,请勿私自盗用。本代码仅供参考,还请各位读者不吝赐教。
思路:因为单链表而且要从后往前数(2333比较烦逆序一类的题目),首先要把链结点个数给求出来,(本道题比较特殊,虽然有头结点,但做完题之后发现可以不用考虑头结点的问题。)然后再把通过计数找到顺序题目要求的链结点元素。
参考代码:
ElementType Find( List L, int m )
{
int count = 0;
List temp = L->Next;
while(temp)
{
count++;
temp = temp->Next;
}//此步以上都是测得链表元素数量
temp = L->Next;
count = count-m+1;
int judge = 0;
int Get;
while(temp)
{
judge++;
if(judge == count)
{
Get = temp->Data;
return Get;
}
temp = temp->Next;
}
return ERROR;
}