タイトル:リンクリストを入力し、リンクリストの出力の逆数k番目のノードは、ほとんどの人々の習慣に従うために、この質問は、ノードリストの最後には、最初のノードの逆である、すなわち、1からカウントを開始します。たとえば、リンクリストにはヘッドノードから始まる6つのノードがあり、その値は1、2、3、4、5、6です。このリンクリストの最後から2番目のノードは、値が4のノードです。
例:入力1-> 2-> 3-> 4-> 5およびk = 2;出力:4-> 5
テストサイト:コードの堅牢性
アルゴリズム:1. 初期化:フロントポインターが前、リアポインターが後、両方のポインターがヘッドノードを指します。
2. デュアルポインター距離を構築します。フロントポインターはk-1ステップだけ前進します。
3. ダブルポインターの動き:k番目のステップから、2つのポインターは、前のノードがテールノードを指すまで一緒に前進します。
4. 戻り値:後で返すだけです。
時間の複雑さO(N):Nはリンクされたリストの長さであり、前者はN-1ステップずつ進み、後者はNkステップだけ進みます。
スペースの複雑度O(1):前者はダブルポインター、後者は一定サイズのスペースを使用します。
上記のアルゴリズムに従って、次のコードを書くことができます:
#単一リンクリストの定義。 #クラスListNode: # デフ__init __(自己、X): # self.val = X # self.next =なし クラスソリューション: DEF getKthFromEnd(自己、ヘッド:ListNode、K:INT) - > ListNode: 前者 =後者= ヘッド 用 _ 中範囲(K-1 ): 前者 = former.next 一方former.next: 後者は、前者 =はlatter.next、former.next リターン後者
しかし、上記のコードの堅牢性は十分ではなく、3つの問題があります。
- リンクされたリストは空です。コードがnullポインターが指すメモリにアクセスし、プログラムがクラッシュするため
- 入力パラメーターk = 0;また、プログラムがクラッシュします
- リンクリストのノード数はk未満です。また、nullポインタが指すメモリにアクセスしてプログラムをクラッシュさせるという問題もあります。
コードを改善する:
#単一リンクリストの定義。 #クラスListNode: # デフ__init __(自己、X): # self.val = X # self.next =なし クラスソリューション: デフ getKthFromEnd(自己、ヘッド:ListNode、K:INT) - > ListNode: #空链表 場合 ではありませんヘッド: リターンヘッド #1 はk = 0 であれば K == 0: 戻りなし 前者 =後者= ヘッド 用 _ 中範囲(K-1): #k>链表长度 if以前の.next が None でない場合: 元 = 以前の.next else : 戻り値なし 一方 、以前の.next:後者、以前の = 後者.next、以前の.next が後者を返す