チェーンテーブルの最後からk番目のノードを求めます


タイトル説明:一方向チェーンテーブルを入力し、チェーンテーブルの最後からk番目のノードを出力し、チェーンテーブルの最後から0番目のノードがチェーンテーブルの最後のポインタである.
第1の反応は、まずチェーンテーブルを1回遍歴し、産度lを得、次にチェーンテーブルをl−kに遍歴し、需要ノードを得ることであり、この方法は最適ではない.
2つのポインタp,qを設定し,pとqの間をk個のノードから離し,p,qをチェーンテーブルに同期させてチェーンテーブルの末尾ノードに移動させるべきであるが,pは逆数k番目のノードを指す.
struct Node{
	char data;
	Node* next;
}
Node *p,*q;
Node* fun(Node *head,int k){
	assert(k>=0);//     
	p=q=head;
	for(;k>0&&q!=NULL;k--)
		q=q->next;
	if(k>0)return NULL;//  k      
	while(q!=NULL){
		p=p->next;
		q=q->next;
	}
	return p;
}