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
}
浙公网安备 33010602011771号