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

題目

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

給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list

分析

雙指針,和之前一樣的解法,先走n,然後兩個指針一塊兒走,a指針走到頭了,b指針正好在倒數n這個位置上。

解法

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    if head == nil || n <= 0 {
        return head
    }
    
    a, b := head, head
    for i:= 0; i < n;i++ {
        b = b.Next
        if b == nil {
        	// 長度剛好等於鏈表長度時候,那麼直接刪除頭。
            if i == n-1 {
                head = head.Next
                return head
            }
            return nil
        }
    }
    
    // 假設b走到頭了nil了,那麼a會正好站在n位置上。所以判斷Next不爲nil,就能讓a停在n的前一個
    for b.Next != nil {
        a = a.Next
        b = b.Next
    }
    
    // 刪除,b都有Next,a必然有,所以不怕Panic。
    a.Next = a.Next.Next
    
    return head
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章