该题的解题模板(def参数)为要删除的node,没有给定头指针(head),因此无法利用pre进行删除。之前链表题目大多要求不直接修改结点的值,但是该题没有头结点,只能采用修改值得方式。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val # 将node的值替换成其下一个结点的值
node.next = node.next.next # 替换完成后,直接将node指向下下个结点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
# 删除倒数第n个,使用两个指针slow和fast,初始化均为dummy(索引为0),然后fast向后移动,
# 直到fast与slow(head)相差n(n指索引相差n),
# 随后slow和fast一起向后移动,直到fast先到达末尾,这样slow与fast总是相差n,slow就记录了倒数第n+1个数。
slow = fast = dummy = ListNode(0)
dummy.next = head
for _ in range(n):
fast = fast.next
while fast.next:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next