题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:给定的 n 保证是有效的。
思路:
使用快慢指针,快指针先走n步,当快指针指向链表最后一个结点时,慢指针指向要删除结点的前一个结点。
注意:为了避免被删除结点为链表第一个结点时所带来的复杂操作,在头节点之前再引入一个pre结点。
解答:
# 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:
pre=ListNode(0)
pre.next=head
slow=fast=pre
for _ in range(n):
fast=fast.next
while fast.next:
slow=slow.next
fast=fast.next
slow.next=slow.next.next
return pre.next
更新:注意与上述方法的差别
# 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:
pre=ListNode
pre.next=head
fast,slow=pre,pre
#确保结束时,fast指向待删除结点的上一个结点
for _ in range(n+1):
fast=fast.next
while fast:
fast=fast.next
slow=slow.next
slow.next=slow.next.next
return pre.next