1. 程式人生 > >leecode刷題(21)-- 刪除鏈表的倒數第N個節點

leecode刷題(21)-- 刪除鏈表的倒數第N個節點

from 鏈表 nth nod 刪除鏈表 mov 頭結點 移動 lin

leecode刷題(21)-- 刪除鏈表的倒數第N個節點

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

描述:

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

示例:

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

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

說明:

給定的 n 保證是有效的。


思路:

這道題我們可以采用雙指針法來解答。定義兩個指針 left 和 right, 都讓其指向鏈表的頭節點。先讓 right 指針向後移動 n 步,然後 left 指針和 right 一起向後移動,當 right 的 next 指針為 NULL 時,left 指針即指向了要刪除節點的前一個節點,接著讓 left 的 next 指針指向要刪除節點的下一個節點即可。這裏我們需要註意的是,如果要刪除的節點剛好是頭節點,那麽 right 指針向後移動結束時就會為 NULL,所以加一個判斷其是否為 NULL 的條件,若為 NULL 則返回頭節點的 next 指針。

代碼如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode left = head;
        ListNode right = head;
        
        for(int i = 0; i < n; i++) {
            right = right.next;
        }
        
        if(right == null) {
            return head.next;
        }
        
        while(right.next != null) {
            left = left.next;
            right = right.next;
        }
        left.next = left.next.next;
        return head;
        
    }
}

leecode刷題(21)-- 刪除鏈表的倒數第N個節點