方法一:先遍历一次链表,得到长度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; ++i)
p = p->Next;
return p->Data;
}
方法二:定义两个指针变量p1,p2,在初始时都指向L的头结点,指针p1先开始移动,当p1指针移动到m个节点时,p2指针开始与p1同步移动,当p1指针移动到链表最后一个节点时,p2指针所指的元素为倒数第m个节点
ElementType Find( List L, int m )
{
PtrToNode p;
int counter;
p1=p2=L;
counter=0;
while(p1&&(++counter<=m))
p1=p1->Next;//p1移动到m个节点位置
if(counter<=m)
return ERROR;//counter是有个确切值的m可能没有,所以有可能m会超出counter
while(p1)
{
p1=p1->Next;
p2=p2->Next;
}
return p2->Date;
}