トピック:
入力されたリンクリスト、リンクリスト出力の逆数k番目のノード。
分析:
第一の溶液は、我々が最初に、再度リストをトラバースnはノードの総数を計算することができ、その後、すなわち、kは最後から二番目のノードのヘッドノードのNKチェックノードです。
第2の解決策は、次に、ポインタが最初のノードの端に到達したとき、両手を有する第2の進行、両方のポインタは、最初のノードにK-1ノードに第ポインタ進歩を指している、二重ポインタの使用でありますポインタの指節我々の要求です。
また、kが0の場合はNULLを返すように、kはリンクされたリスト内のノードの数よりも大きい場合、NULLを返すべきであることに留意されたいです。
手順:
C ++
/ * 構造体ListNode { int型のval; 次のstruct ListNode *; ListNode(INT X): ヴァル(x)は、次の(NULL){ } }。* / クラスソリューション{ パブリック: ListNode * FindKthToTail(ListNode * pListHead、符号なし整数のK){ 場合(pListHead == nullptr || K == 0 ) 戻りnullptr。 ListNode * pFirst = pListHead。 ListNode * pSecond = pListHead。 以下のために(int型私は= 0 I <K-;1 ; ++ I){ もし!(pFirst->次= nullptr) pFirst = pFirst-> 次。 それ以外 の戻りnullptr; } ながら(!pFirst->次= nullptr){ pFirst = pFirst-> 次。 pSecond = pSecond-> 次。 } 戻りpSecondと、 } }。
ジャワ
/ * パブリッククラスListNode { int型のval; ListNode次= NULL; ListNode(int型のval){ this.val =ヴァル。 } } * / パブリック クラスソリューション{ 公共 ListNode FindKthToTail(ListNodeヘッド、INT K){ 場合(ヘッド== NULL || K == 0 ) リターン ヌル。 ListNode pFirst = ヘッド。 ListNode pSecond = ヘッド。 以下のために(INT I 0 =; I <K-1; ++ I){ もし(!pFirst.next = ヌル) pFirst = pFirst.next。 他の リターン はnull ; } 一方(pFirst.next!= NULL ){ pFirst = pFirst.next。 pSecond = pSecond.next。 } 戻りpSecondと、 } }