Swordはoffer22を参照します:リンクリストの下からK番目のノード

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;
    }
}

4、実行中の結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_42681119/article/details/115328288