題目
給定一個鏈表,刪除鏈表的倒數第 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
}