刪除鏈表的倒數第N個節點

給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。

示例:

給定一個鏈表: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
說明:

給定的 n 保證是有效的。

進階:

你能嘗試使用一趟掃描實現嗎?

題目大意
  刪除單鏈表的倒數第N個結點,注意:輸入的N都是合法,在一次遍歷中完成操作。

解題思路
  先讓一個指針走找到第N個節點,然後再讓一個指針指向頭結點,然後兩具指針一起走,直到前一個指針直到了末尾,後一個指針就是倒數第N+1個結點,刪除倒數第N個結點就可以了。

代碼實現

public class Solution {

    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode pa=head;
        ListNode pb=head;

        //注意:pa指向第n+1個節點
        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;

        return head;

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章