项目场景:
请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第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
。
问题描述
ElementType Find(List L,int m)
{
/*链表长度好像不算最后的空结点的这是一个带头结点的单链表*/
PtrToNode p1,p2;
p1=L;
p2=L;
int count=0;
while (p1&&(count)<m)
{
p1=p1->Next;
count++;
}
/*利用count来判断是否元素存在*/
if(count<=m)/*头结点改了后面判断条件没改就一直error*/
return ERROR;
while(p1)
{
p1=p1->Next;
p2=p2->Next;
}
return p2->Data;
}
解决方案:
ElementType Find(List L,int m)
{
/*链表长度好像不算最后的空结点的*/
PtrToNode p1,p2;
p1=L;
p2=L;
int count=0;
while (p1&&(count)<m)
{
p1=p1->Next;
count++;
}
/*利用count来判断是否元素存在*/
if(count<m)
return ERROR;
while(p1)
{
p1=p1->Next;
p2=p2->Next;
}
return p2->Data;
}