019、Remove Nth Node From End of List(シングルチェーンテーブルの最後からN番目のノードを除去)

1346 ワード

http://blog.csdn.net/DERRANTCM/article/details/46997239
https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/
本題
Given a linked list,remove the nth node from the end of list and return its head.
For example、
Given linked list:1->>2->3->4->5,and n=2.After removing the second node from the end,the linked list becompes 1->2->3->5.
ノート:
Gven will always be valid.
Try to do this in one pass.
タイトルの大意
シングルチェーンテーブルの最後からN番目の結点を削除します。入力したNは合法的で、一回の遍歴で操作が完了します。
問題を解く構想
まず、一つのポインタを歩いて、N番目のノードを見つけて、もう一つのポインタを頭の結点に向けて、そして二つのポインタを一緒に行って、前のポインタが最後になるまで、後のポインタは最後からN+1番目の結点で、最後からN番目の結点を削除すればいいです。
public class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode pa = head;
        ListNode pb = head;

        //    n   
        for (int i = 0; i < n && pa != null; i++) {
            pa = pa.next;
        }


        if (pa == null) {
            head = head.next;
            return head;
        }

        // pb pa  n-1   
        //  pa.next null,pb    n+1   
        while (pa.next != null) {
            pa = pa.next;
            pb = pb.next;
        }

        pb.next = pb.next.next; //pb.next       
        return head;
    }
}
赤い部分で半日考えましたが、この逆数のN番目を直接削除して、直接チェーンに戻りました。酔いました。