给你一个链表,删除链表的倒数第 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

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

 

分享解题思路,使用【链表】算法

解题思路

1.创建虚拟节点,设下一个指针链表头部
创建两个指针,慢指针和快指针,初始化为虚拟节点

2.让快指针移动到最后一个节点,并且比慢指针快n+1步

3.移动两指针,让两指针到达链表的末尾

4.【删除节点】的上一个节点指向【删除节点】的下一个节点,也就是直接跳过删除节点来做删除节点操作

5.返回虚拟节点,又从头开始有一个新链表

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        dummyhead = ListNode(0, head)
        fast = slow = dummyhead
        for i in range(n + 1):
            fast = fast.next
        while fast:
            fast = fast.next
            slow = slow.next
        slow.next = slow.next.next
        return dummyhead.next


if __name__ == '__main__':
    a = Solution()
    head = [1, 2, 3, 4, 5]
    n = 2
    print(a.removeNthFromEnd(head,n))