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


この問題は本当に簡単に答えることができて、同時に面接問題の中でとてもよくある問題で、この問題を出して言うのは、自分がコードを書く習慣を強めるためで、技術面接のHRに自分のすごい様子を見てもらうためです.アルゴリズムのテーマを設計するときは、一定のスムーズさに従うのが良い習慣です.
1>アルゴリズム設計--戦略を立て、千里の外に勝つ
複雑なアルゴリズムに遭遇した場合、図面(ツリー、図などのデータ構造のアルゴリズム)、例(まずいくつかの小さな例を利用して問題を整理する)、小さなサブ問題(分治または動的計画の問題)に分けることができる.
2>試験用例の作成--兵馬が動かず、食糧草が先行する
注意境界条件入力、特殊入力、エラー処理など.
3>コード実装
4>デバッグBug
ブレークポイントを設定し、単一ステップで追跡し、メモリを表示し、呼び出しスタックを分析します.問題を迅速に見つけ、解決することができます.
 
チェーンテーブルの最後からK番目のノードを求める問題に対して、ここではテスト用例の作成だけをリストして、この部分はとても重要で、軽視してはいけません!
//        ,head k     
1. head = NULL
2. k <= 0
2. k            

  
最後のコード実装:
ListNode* FindKthToTail(ListNode* head, int k)
{
	if(NULL == head)
	{
		return NULL;
	}
	if(k <= 0)
	{
		return NULL;
	}

	ListNode *ptr = head;
	for(int i = 0; i < k - 1 && NULL != ptr; i++)
	{
		ptr = ptr->next;

	}//for

	if(NULL == ptr)
	{
		return NULL;
	}//if

	ListNode *pcur = head;
	while(NULL != ptr->next)
	{
		ptr = ptr->next;
		pcur = pcur->next;
	}//while

	return pcur;
}

 
Bugをデバッグしたところ、whileサイクルでptr->nextが空の値に等しいかどうかではなく、ptrが空の値に等しいかどうかを判断した場合、正しい結果は得られないことが分かった.だから上のアルゴリズムの設計手順は重要です.