返回

纵览剑指 Offer 22 题解:纵享代码魅力,洞察数据结构奥秘

前端

算法概述:双指针技巧巧解倒数第k个节点问题

剑指 Offer 22 题本质上是一个链表操作问题,要求您在给定链表中找到倒数第 k 个节点。解决此类问题,我们通常会借助双指针法。双指针法巧妙地利用两个指针,一个指针从链表头部开始遍历,另一个指针从倒数第 k 个节点处开始遍历。这两个指针同时前进,直到第一个指针到达链表尾部,此时第二个指针恰好指向倒数第 k 个节点。

伪代码实现:轻松理解双指针法

为了帮助您更好地理解双指针法,这里提供一段伪代码实现:

def find_kth_from_end(head, k):
    # 设置两个指针,一个指向头部,一个指向倒数第 k 个节点
    first = head
    second = head
    
    # 让第二个指针先前进 k 步
    for _ in range(k):
        second = second.next
    
    # 两个指针同时前进,直到第一个指针到达链表尾部
    while first.next:
        first = first.next
        second = second.next
    
    # 此此时第二个指针指向倒数第 k 个节点
    return second

代码示例:Python 代码实现双指针法

为了让您能够亲身体验双指针法的威力,我们提供了以下 Python 代码示例:

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

def find_kth_from_end(head, k):
    first = head
    second = head
    for _ in range(k):
        second = second.next
    while first.next:
        first = first.next
        second = second.next
    return second

# 创建一个链表
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)

# 查找倒数第 k 个节点
k = 2
result = find_kth_from_end(head, k)

# 打印结果
print("倒数第", k, "个节点的值为:", result.val)

总结:剑指 Offer 22 题解精髓

剑指 Offer 22 题考察的不仅仅是链表操作的技巧,更考验您对算法思维的理解和灵活运用。双指针法的精髓在于巧妙利用两个指针同时遍历链表,从而在一次遍历中找到倒数第 k 个节点。希望本篇博文能够帮助您掌握这种技巧,并在算法学习的道路上不断进步。