オファーの表面安全質問22(Javaバージョン)を証明する:リストの最後から二番目のノードK

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/littlehaes/article/details/91411250

私のブログへようこそ

オファーの表面安全質問22(Javaバージョン)を証明する:リストの最後から二番目のノードK

タイトル説明

入力されたリンクリスト、リンクリスト出力の逆数k番目のノード。

注釈

  • 決意をロバスト性:入力ノードがnullであり、k <= 0例外はあります

複雑

  • 時間複雑:O(n)は、
  • 宇宙複雑:O(1)
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        // input check
        if(head == null || k<=0)
            return null;
        //execute 
        ListNode fast = head;
        ListNode slow = head;
        // 下面这个循环让fast位于第K个Node上; 非正常退出循环说明链表长度不足K
        for(int i = 0; i < k - 1; i++){ // 包括slow在内, 从slow到fast是K个节点; 所以fast得先向前移动K-1步
            if(fast.next == null)
                return null; // 链表长度不足K
            fast = fast.next;
        }
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

非常にきれいなコード

感じて、上記その方法を把握するには、主に一般的な面接の慎重な思考を反映しています

public ListNode FindKthToTail(ListNode head,int k) { 
        ListNode p, q;
        p = q = head;
        int i = 0;
        for (; p != null; i++) {
            if (i >= k)
                q = q.next;
            p = p.next;
        }
        return i < k ? null : q;
    }

おすすめ

転載: blog.csdn.net/littlehaes/article/details/91411250