美文网首页
双指针 3 (删除链表倒数第 N 个结点 leetcode 19

双指针 3 (删除链表倒数第 N 个结点 leetcode 19

作者: Sisyphus235 | 来源:发表于2023-01-29 20:58 被阅读0次

思想

双指针算法不仅应用于链表,在数组等数据结构中也有广泛应用。
核心思路是指向问题中的关键节点,根据问题的上下文逻辑变换位置,最终解决问题。

实例

删除链表倒数第 N 个结点 leetcode 19

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

输入:
(1)head: ListNode,一个链表
(2)n: int,指定倒数第 n 个结点

输出:
ListNode,将倒数第 n 个结点删除,返回链表头节点。

举例:
当 head = [1,2,3,4,5], n = 2 时,删除倒数第二个节点 4,返回 [1,2,3,5]。

关键点

核心是表达倒数第 n 个节点,这里的关键点是使用两个指针,让他们的差值是 n,当后面的指针到达末尾的时候,前面的指针刚好是倒数第 n 个节点。

编码

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


def remove_nth_node_from_end_of_list(head: ListNode, n: int) -> ListNode:
    # 边界条件
    if n == 0:
        return head
    if n < 0:
        raise RuntimeError('invalid n')
    # 建立 dummy 节点,方便处理边界条件
    dummy = ListNode(next=head)
    # 双指针初始化
    slow = fast = dummy
    # 建立双指针的差值
    for _ in range(n):
        if fast is None:
            raise RuntimeError('nth node from end of list not exist')
        fast = fast.next
    # 定位倒数第 n 个节点
    while fast.next is not None:
        fast = fast.next
        slow = slow.next
    # 删除该节点
    slow.next = slow.next.next
    return dummy.next

相关

双指针 0
双指针 1
双指针 2

相关文章

网友评论

      本文标题:双指针 3 (删除链表倒数第 N 个结点 leetcode 19

      本文链接:https://www.haomeiwen.com/subject/xtiphdtx.html