タイトル説明
入力されたリンクリスト、リンクリスト出力の逆数k番目のノード。例:リンクされたリスト、リンク・リスト出力逆数k番目のノードを入力してください。ほとんどの人々の習慣を満たすために、この質問には1から数え、それはリストのエンドノードが最後から二番目のノードです。例えば、リンクされたリストは、6つのノードを有し、ノードはスクラッチ値から開始し、その連続1,2,3,4,5,6です。このリストの3最後から二番目のノードは、ノード4の値です。
問題解決のためのアイデア
異常な溶液、N見つけるリストの長さは、k個のノードは結果を横断した後に見つかった、の長さを通って最後から2番目の位置のn-k + 1を発見し、この方法の効率は2Nであり、我々は、ここで二重ポインタ方法を、この方法を使用していません達成。
1. K-1のノードをトラバースポインタリストの先頭から最初のポインタは、第2のポインタは移動しない
2は、k個のステップを開始する第2のポインタから始まる横切るヘッド・ポインタ・リストである
。3.二つ以来ポインタは、単に第2のポインタはまた、最後から二番目のノードkで到達するために、最初のポインタがリストの最後に達したときに、K-1のままです。
堅牢性:堅牢な堅牢なは、それが異常と危険な状況の下で生き残るためのシステムで重要であり、堅牢で強力な意味で音訳、です。例えば、入力エラー、ディスク障害、ネットワークの過負荷や意図的な攻撃の場合におけるコンピュータソフトウェア、クラッシュしていない、クラッシュすることはできません、ソフトウェアの堅牢性です。
このロバスト性の問題は、三た:
1.空のノード
2は、ノードKの総数よりも小さい
0以上3。K
コードの実装
/// <要約> /// 链表 /// </要約> パブリック クラスListNode { 公共 のint アイテム。 公共ListNode次。 公共 ListNode(INT X) { アイテム = X。 } /// <要約> /// 生成链表 /// </要約> /// <PARAM NAME = "長さ"> </ PARAM> パブリック 静的 ListNode CreateNodeList(int型の長さ) { ListNode listNode= 新しい ListNode(0 )。 VaRの温度= listNode。 以下のために(int型私= 1 ; iが長さを<; Iは++ ) { TEMP = nextList(TEMP、I)。 } 戻りlistNodeと、 // 下一个 ListNode nextList(ListNodeノード、int型の値) { ながら(!node.next = NULL ) { ノード = node.next。 } VAR次= 新しいListNode(値)。 node.next = 次回。 戻る次; } } }
パブリック 静的 ListNode FindBackKth(ListNodeノード、int型K){ 場合(ノード== NULL || K <= 0 ){ 戻り ヌル。 } ListNode firstNode = ノード。 ListNode secondNode = ノード。 以下のために(int型 i = 1 ; iが<= K - 1 ; I ++ ){ firstNode = firstNode.next。 もし(firstNode == NULL ){ リターン ヌル。 } } 一方(firstNode.next!= NULL ){ firstNode = firstNode.next。 secondNode = secondNode.next。 } 戻りsecondNode。 }
テスト
【事実】 公共 ボイドTestNull() { ListNode listNode = NULL ; Assert.Null(Coding014.FindBackKth(listNode、9 ))。 } [ファクト] 公共 ボイドTestK() { ListNode listNode = 新しい ListNode(1 )。 Assert.Null(Coding014.FindBackKth(listNode、0 )); Assert.Equal(1、Coding014.FindBackKth(listNode、1 ).item)。 Assert.Null(Coding014.FindBackKth(listNode、2)); } [ファクト] 公共 ボイドのTest1() { // 0,1,2,3,4,5 ListNode listNode = ListNode.CreateNodeList(6 )。 Assert.Null(Coding014.FindBackKth(listNode、0 )); Assert.Null(Coding014.FindBackKth(listNode、7 ))。 Assert.Equal(3、Coding014.FindBackKth(listNode、3 ).item)。 Assert.Equal(5、Coding014.FindBackKth(listNode、1 ).item)。 Assert.Equal(0、Coding014.FindBackKth(listNode、6)。項目); }