获取单链表的倒数第五个元素,该如何解决

获取单链表的倒数第五个元素
请教一道算法题,
Write a function that will return the 5th element from the end ( not from the head of the list) in a singly linked list of integers, in one pass, and then provide a set of test cases against that function that would make you comfortable with shipping this code to customers. 

我的算法是,设置两个指针,都指向单链表的起点,遍历时,第一个指针先走,第二个指针在第一个指针走了5步时才开始走,这样当单链表到达尽头时(第一个指针的Next为空指针),第二个指针的位置就是倒数第五个元素。

可是,面试官说我的算法totally wrong。

请教大家,我的算法有什么问题?代码如下:

  int Get5thElementFromEnd(Link link)
  {
  Link link1 = link;
  Link link2 = link;

  int count = 0;

  while(link1 != null)
  {
  count++;
  link1 = link1.Next;

  if (count > 5)
  {
  link2 = link2.Next;
  }
  }

  return link2.Value;
  }

  //一个自定义单链表
  public class Link
  {
  public Link Next;

  public int Value;

  public Link(int Value)
  {
  this.Value = Value;
  }
  }

------解决方案--------------------
one pass,one pass.
只能是走一次.

可以这样:
设置一个5个节点的循环链表,节点可定义为:
struct CNode{
Node* pos;//Node为要处理的单链表的节点的类型.
CNode *next;
};
这样,我们只要在访问完单链表的一个节点后,把其地址作为CNode的pos域的值,并加入到循环链表的尾部,然后,调整尾部.当访问完整个链表后,再取循环链表中的尾部的下个节点,就得到了循环链表的头部,也就是单链表倒数第五个节点的地址,再按地址访问就可以了.
------解决方案--------------------
链表反序 ,反序后找第五个元素(now from the beginning)
------解决方案--------------------
如果是第n个

动态分配n个
for(i=0; p->next; i=(i+1)%n)
结束时第i个保存值就是结果了


1楼说的很明白了
totally wrong
“one pass,one pass. ”
就是只能遍历一次

------解决方案--------------------
LZ,你的算法是两个指针分别走,就走了2次链表;而一楼的是一个指针走,每走一次,存储一次地址,所以只是走了一次。
------解决方案--------------------
只能遍历一次 

------解决方案--------------------
两个指针先后走,每个指针都遍历了一遍(前面的一遍,后面的少走5步)整个链表,不符合要求。
5个节点和5个存储位置的方法,增加了节点或者存储单元赋值(记录地址)的操作(在每经过一个节点时),但是满足题目要求。从效率上讲,你的方法多了一串取NEXT操作,而上面的两种多的是赋值操作,差别就在这里。不见得就差。可能关键是不符要求。
------解决方案--------------------
你这个比遍历两次还慢(一次记长度,二次取指针)
因为遍历两次第二次不用判断!=null
------解决方案--------------------
阿诺nb啊。。。这都想到了
------解决方案--------------------
只能说你的面试官有点问题,两个指针的算法已经是可以的了:),因为从时间复杂度来讲,只是o(n)
------解决方案--------------------
用一个数组记录所有的节点
int Get5thElementFromEnd(Link link) 

Link link1 = link;
Link link2[100]; //假设链表最长为100,好久没用java了,这样写不知道对不对,只是说下意思
int count = 0; 

while(link1 != null) 

link2[count++] = link1; 
link1 = link1.Next; 



return link2[count - 5].Value; 

不知道这样做可以不?