1.タイトルの説明
リンクリストを入力し、リンクリストの下からk番目のノードを出力します。ほとんどの人の習慣に合わせるために、この質問は1から数え始めます。つまり、リンクリストの終了ノードは下から最初のノードです。
たとえば、リンクリストには6つのノードがあります。ヘッドノードから始めて、それらの値は1、2、3、4、5、および6です。このリンクリストの下から3番目のノードは、値が4のノードです。
2つの問題解決のアイデア
アイデア1:
1.リンクリストの長さを数え、nとして記録し
ます。2。ポインターを設定して、最初に(nk)ステップを実行します。次に、K番目のノードを見つけることができます。
アイデア2(デュアルポインター):
1.デュアルポインタを低速と高速に設定して、両方が先頭に来るようにします
。2。高速を最初にkステップ進みます。3。
低速と高速を同時に、高速が空になるまで段階的に逆方向に移動します
。4。スローの位置は最後から2番目の位置です。Kノード
3、コードの実装
1つを実現します。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if(head==null) return null;
ListNode cur=head;
int size=0;
while(cur!=null){
size++;
cur=cur.next;
}
cur=head;
while(size-k>0){
cur=cur.next;
size--;
}
return cur;
}
}
実装2:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if(head==null) return null;
ListNode slow=head;
ListNode fast=head;
for(int i=0;i<k;i++){
fast=fast.next;
}
while(fast!=null){
slow=slow.next;
fast=fast.next;
}
return slow;
}
}