📜  逆序打印链表的最后k个节点|迭代方法(1)

📅  最后修改于: 2023-12-03 15:41:56.923000             🧑  作者: Mango

逆序打印链表的最后k个节点|迭代方法

简介

逆序打印链表的最后k个节点是一道经典的算法问题。对于一个单向链表,从尾到头输出倒数第k个节点至链表的最后一个节点的值。

这里提供一种迭代方法来解决这个问题。

算法思路

为了找到链表的倒数第k个节点,需要使用两个指针。

  1. 让第一个指针从链表的头节点开始向前移动k-1步;
  2. 然后让两个指针同时往前移动,当第一个指针到达链表的尾节点时,第二个指针则是倒数第k个节点。

得到倒数第k个节点之后,只需要从该节点开始遍历链表,输出每个节点的值即可。

代码实现
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def print_last_k_nodes(head, k):
    if not head or k <= 0:
        return None

    # 第一个指针先移动k-1步
    p1 = head
    for i in range(k - 1):
        if p1.next:
            p1 = p1.next
        else:
            # k的值大于链表的长度
            return None

    # 同时移动两个指针
    p2 = head
    while p1.next:
        p1 = p1.next
        p2 = p2.next

    p = p2
    res = []
    while p:
        res.append(p.val)
        p = p.next

    return res[::-1]
代码解释

在实现中,首先判断链表是否为空或k是否小于等于0,如果是则返回空。

接着,第一个指针p1先移动k-1步,如果此时p1.next为空,说明k的值大于链表的长度,返回空。

然后,定义第二个指针p2指向链表的头节点,同时p1和p2向前移动。当p1到达链表的尾节点时,p2对应的节点就是倒数第k个节点。

最后,从p2开始遍历链表,把每个节点的值存储到一个列表中,并使用[::-1]将列表逆序输出。

总结

本文介绍了一种迭代方法来解决逆序打印链表的最后k个节点的问题。这种方法的时间复杂度为O(N),空间复杂度为O(K),比较高效。