剑指OfferII021.删除链表的倒数第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

进阶:能尝试使用一趟扫描实现吗?

注意:本题与主站 19 题相同

解题思路分析

1、遍历;时间复杂度O(n),空间复杂度O(1)

func removeNthFromEnd(head *ListNode, n int) *ListNode {
   temp := &ListNode{Next: head}
   cur := temp
   total := 0
   for cur.Next != nil {
      cur = cur.Next
      total++
   }
   cur = temp
   count := 0
   for cur.Next != nil {
      if total-n == count {
         cur.Next = cur.Next.Next
         break
      }
      cur = cur.Next
      count++
   }
   return temp.Next
}

2、快慢指针;时间复杂度O(n),空间复杂度O(1)

剑指OfferII021.删除链表的倒数第n个结点

func removeNthFromEnd(head *ListNode, n int) *ListNode {
   temp := &ListNode{Next: head}
   fast, slow := temp, temp
   for i := 0; i < n; i++ {
      fast = fast.Next
   }
   for fast.Next != nil {
      fast = fast.Next
      slow = slow.Next
   }
   slow.Next = slow.Next.Next
   return temp.Next
}

3、递归;时间复杂度O(n),空间复杂度O(n)

var count int

func removeNthFromEnd(head *ListNode, n int) *ListNode {
   if head == nil {
      count = 0
      return nil
   }
   head.Next = removeNthFromEnd(head.Next, n)
   count = count + 1
   if count == n {
      return head.Next
   }
   return head
}

总结

Medium题目,题目同leetcode 19.删除链表的倒数第N个节点

展开阅读全文

页面更新:2024-05-11

标签:结点   递归   倒数   进阶   本题   复杂度   遍历   快慢   节点   示例   指针   数目   题目   时间   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top