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
}

  

posted @ 2020-09-10 13:13  胖胖咩  阅读(211)  评论(0)    收藏  举报