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 }

 

posted on 2022-10-15 23:28  HHHuskie  阅读(17)  评论(0编辑  收藏  举报

导航