19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
方法1——计算长度
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:length = 0cur = headwhile cur:length += 1cur = cur.nextlength = length-ncur = headl = 0if l == length:return head.nextwhile l < length-1:cur = cur.nextl += 1cur.next = cur.next.nextreturn head
方法2——双指针
对法1的优化,让两个指针保持n的距离,并让其中一个指针到达第n个节点后同向移动,巧解本题。
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:sentinel = ListNode(0)sentinel.next = headfirst, second = sentinel, headfor i in range(n-1):second = second.nextwhile second and second.next:first = first.nextsecond = second.nextfirst.next = first.next.nextreturn sentinel.next
