19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
官方解法:
func getLength(head *ListNode) (length int) { for ; head != nil; head = head.Next { length++ } return } func removeNthFromEnd(head *ListNode, n int) *ListNode { length := getLength(head) dummy := &ListNode{0, head} cur := dummy for i := 0; i < length-n; i++ { cur = cur.Next }
// 若删除的节点为第一个节点,此时cur为dummy,即dummy指向head后的节点 cur.Next = cur.Next.Next return dummy.Next }
进阶:你能尝试使用一趟扫描实现吗?
双指针法:
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func removeNthFromEnd(head *ListNode, n int) *ListNode { dummy := &ListNode{ Next:head, }
// 快指针(比满指针快n+1步,指向nil时停止) cur := head
// 满指针(指向被删元素的前一个节点) pre := dummy i := 0 for cur != nil { cur = cur.Next if i >= n { pre = pre.Next } i++ }
// 若删除的节点为第一个节点,此时pre为dummy,即dummy指向head后的节点 pre.Next = pre.Next.Next return dummy.Next }