オファーが届きました。友達を掘って受け取りましょう!私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示します。
1.トピックの説明:
トピックのソース:LeetCode>リンクリストのk番目の最後のノード
リンクリストを入力し、リンクリストの下からk番目のノードを出力します。ほとんどの人の習慣に合わせるために、この質問は1から数え始めます。つまり、リンクリストのテールノードは最後から2番目のノードです。
たとえば、リンクリストにはヘッドノードから始まる6つのノードがあり、それらの値は1、2、3、4、5、6の順になっています。このリンクリストの最後から3番目のノードは、値が4のノードです。
例:
リンクリストが与えられた場合:1-> 2-> 3-> 4-> 5、およびk=2。
リンクリストに戻る4->5。
2.思考分析:
アイデア1:
- 一般的な考え方:順次検索アルゴリズム
- 現在のリンクリストの長さがnであると仮定します
- リンクリストの最後から2番目のk番目のノードは正の数n-k番目のノードです
- リンクリストのn-k番目のノードに順次移動するのは、最後のk番目のノードです。
アイデア2:
- 一般的な考え方:ダブルポインター方式(高速ポインターと低速ポインター)
- リンクリストのk+1番目のノードへの最初のポインタをポイントします
- 2番目のポインターは、リンクリストの最初のノードを指します
- この時点で、2つのポインター間の距離は正確にkノードです。
- 2つのポインターは同期して逆方向に移動します。最初のポインターがリンクリストの最後にある空のノードに到達すると、2番目のポインターはリンクリストの下からk番目のノードを指します。
- 最初にリンクリストのヘッドノードへの最初のポインタをポイントし、次にkステップ戻ります。次に、最初のポインタはリンクリストのk+1番目のノードをポイントします。
- 最初に2番目のポインターをリンクリストのヘッドノードにポイントし、2番目のポインターと最初のポインターと同期して逆方向に移動します。最初のポインターがリンクリストの最後にある空のノードを指している場合は、ポイントしたポイントを返します。このとき2番目のポインタでto。ノードを使用できます。
3. ACコード:
アイデア1:
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
int n = 0;
ListNode resultNode = null;
for (resultNode = head; resultNode != null; resultNode = resultNode.next) {
n++;
}
for (resultNode = head; n > k; n--) {
resultNode = resultNode.next;
}
return resultNode;
}
}
复制代码
アイデア2:
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode firstPointer = head;
ListNode secondPointer = head;
while (firstPointer != null && k > 0) {
firstPointer = firstPointer.next;
k--;
}
while (firstPointer != null) {
firstPointer = firstPointer.next;
secondPointer = secondPointer.next;
}
return secondPointer;
}
}
复制代码