数据结构与算法之链表 倒数第 k 个节点 双指针优化 实现

数据结构与算法阿木 发布于 2025-07-11 10 次阅读


摘要:

链表是数据结构中的一种常见类型,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在链表操作中,查找倒数第 k 个节点是一个经典问题。本文将介绍如何使用双指针技术优化解决这个问题,并详细分析其实现过程。

一、

链表是一种非线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表操作包括插入、删除、查找等。在链表操作中,查找倒数第 k 个节点是一个常见且具有挑战性的问题。传统的解决方案可能需要遍历整个链表,时间复杂度为 O(n)。本文将介绍一种使用双指针优化的方法,将时间复杂度降低到 O(n)。

二、问题分析

给定一个链表和一个整数 k,找出链表中倒数第 k 个节点。假设链表的头节点为 head,链表中的节点结构如下:

python

class ListNode:


def __init__(self, value=0, next=None):


self.value = value


self.next = next


三、双指针优化方法

双指针优化方法的核心思想是使用两个指针,一个快指针(fast)和一个慢指针(slow)。快指针先向前移动 k 个节点,然后快指针和慢指针同时移动,直到快指针到达链表末尾。慢指针指向的就是倒数第 k 个节点。

1. 初始化两个指针

- 创建两个指针 fast 和 slow,都指向链表的头节点 head。

- 创建一个变量 k,表示要查找的倒数第 k 个节点。

2. 移动快指针

- 循环 k 次,每次将快指针向前移动一个节点。

- 如果在循环过程中快指针到达链表末尾,说明链表长度小于 k,返回 None。

3. 移动两个指针

- 当快指针到达链表末尾时,慢指针和快指针之间的距离就是 k。

- 同时移动快指针和慢指针,直到快指针到达链表末尾。

- 慢指针指向的就是倒数第 k 个节点。

4. 返回结果

- 返回慢指针指向的节点。

四、代码实现

python

class ListNode:


def __init__(self, value=0, next=None):


self.value = value


self.next = next

def find_kth_to_last(head, k):


fast = slow = head


for _ in range(k):


if fast is None:


return None


fast = fast.next


while fast:


slow = slow.next


fast = fast.next


return slow

测试代码


def create_linked_list(arr):


if not arr:


return None


head = ListNode(arr[0])


current = head


for value in arr[1:]:


current.next = ListNode(value)


current = current.next


return head

def print_linked_list(head):


current = head


while current:


print(current.value, end=" ")


current = current.next


print()

创建链表


arr = [1, 2, 3, 4, 5]


head = create_linked_list(arr)

查找倒数第 k 个节点


k = 2


result = find_kth_to_last(head, k)

打印结果


if result:


print(f"倒数第 {k} 个节点的值为:{result.value}")


else:


print(f"链表长度小于 {k}")


五、总结

本文介绍了使用双指针优化方法解决链表倒数第 k 个节点问题。该方法通过两个指针的协同移动,避免了遍历整个链表,从而将时间复杂度降低到 O(n)。在实际应用中,这种方法可以有效地提高链表操作的效率。