1. 程式人生 > 實用技巧 >leetcode之19刪除連結串列的倒數第N個結點Golang

leetcode之19刪除連結串列的倒數第N個結點Golang

首先連結串列是單鏈表:

type ListNode struct {
	Val  int
	Next *ListNode
}

  那麼假如我們又連結串列1->2->3->4->5

我們需要分如下兩種情況討論

  1、刪除的連結串列結點時頭結點,也就是是說N的值是連結串列的長度:

    此時直接將頭結點指向他的下一個結點

  2、刪除的是中間的結點

    那麼我們需要記錄這個被刪除結點的前一個結點

解題思路如下:

  首先我們有連結串列的頭結點

  我們定義快慢兩個指標(準確說應該是前後兩個指標),這兩個指標的差距就是N

  每次快慢指標同時向後前進一步,當快指標到達最後的時候,慢指標就正好處於被刪除結點的前一個結點

  然後刪除就可以了

程式碼如下:

func removeNthFromEnd(head *ListNode, n int) *ListNode {
	fast, slow := head, head
	// 快指標向後移N步
	for i := 0; i < n; i++ {
		fast = fast.Next
	}
	// 如果快指標移到了最後,說明被刪除的結點應該是連結串列的頭結點
	if fast == nil {
		head = head.Next
		return head
	}
	// 將快指標和慢指標同時向後移動,直到快指標移到了連結串列的最後一個結點
	for fast.Next != nil {
		fast = fast.Next
		slow = slow.Next
	}
	// 刪除結點
	slow.Next = slow.Next.Next
	return head
}