LeetCode解題--チェーンテーブルの最後からK番目のノード


19.チェーンテーブルの最後からN番目のノードを削除する
チェーンテーブルが与えられ、チェーンテーブルの最後からn番目のノードが削除され、チェーンテーブルのヘッダノードが返される.
例:
チェーンテーブルが与えられる:1->2->3->4->5、およびn=2.
最後から2番目のノードを削除すると、チェーンテーブルは1->2->3->5になります.
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //               ,               
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode fast = dummy;
        ListNode slow = dummy;

        for(int i= 0; i< n+1; i++){
            fast = fast.next;
        }
        while(fast!= null){
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return dummy.next;

    }   
    }

22.チェーンテーブルの最後からK番目のノード
チェーンテーブルを入力し、チェーンテーブルの最後からk番目のノードを出力します.多くの人の習慣に合うように、本題は1から数え始めます.すなわち、チェーンテーブルの末尾ノードは最後から1番目のノードです.たとえば、チェーンテーブルには6つのノードがあり、先頭ノードから1、2、3、4、5、6の順に値が表示されます.このチェーンテーブルの最後から3番目のノードは4のノードです.
例:
チェーンテーブルを1->2->3->4->5とk=2とする.
チェーンテーブル4->5に戻る.
解法1:長さを先に計算し,逆数K番目のノードを探し出し,それをヘッダノードとして出力する.
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        //               ,               
        ListNode pre = new ListNode(-1);
        pre.next = head;
        ListNode first = head;
        //    
        int len = 0;
        while(first != null){
          len ++;
          first = first.next;
        }
        
     //   N   ,      L-N+1   
    for(int i = 0; i < len-k+1; i++){
       pre = pre.next;
    }
        return pre;
    }
}

解法2:ダブルポインタは2つのポインタを設定し、fastポインタとslowポインタをK個の位置から離し、fastポインタを末尾に移動させる.
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) { 
       //          ,         
       //         
       ListNode fast = head;
       ListNode slow = head;
       ListNode res = slow;
        //     
        for(int i = 0 ; i < k; i++){
          fast = fast.next;
        }

        while(fast!= null){
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
}
}