题目描述
给你一个链表,删除链表的倒数第 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 <= 300 <= Node.val <= 1001 <= n <= sz
进阶: 你能尝试使用一趟扫描实现吗?
解题思路
- 可以先计算整个链表的长度,然后删除倒数第k个即可
// 计算长度+遍历
func removeNthFromEnd(head *ListNode, n int) *ListNode {
l, h := 0, head
for h != nil {
l++
h = h.Next
}
if l == n {
return head.Next
}
h = head
for i := 0; i < l-n-1; i++ {
h = h.Next
}
h.Next = h.Next.Next
return head
}
- 也可以用双指针,右边的指针先走k步,然后两指针同时向右走,右指针到头,删除左指针的数即可
// 双指针
func removeNthFromEnd2(head *ListNode, n int) *ListNode {
h1, h2 := head, head
for i := 0; i <= n; i++ {
if h2 == nil {
return head.Next
}
h2 = h2.Next
}
for h2 != nil {
h1 = h1.Next
h2 = h2.Next
}
h1.Next = h1.Next.Next
return head
}