当前位置:实例文章 » 其他实例» [文章]每日一题——链表中倒数最后k个结点

每日一题——链表中倒数最后k个结点

发布人:shili8 发布时间:2025-03-15 15:09 阅读次数:0

**每日一题——链表中倒数最后k个结点**

在链表数据结构中,倒数最后 k 个结点是一个经常遇到的问题。这个问题的要求是:给定一个链表和一个整数 k,我们需要找到链表中从末尾开始往前数 k 个结点所指向的元素。

**解决方案**

我们可以使用以下方法来解决这个问题:

1. **双指针法**:我们可以维护两个指针,分别指向链表的头部和尾部。然后,我们可以将第一个指针移动 k 步,这样它就指向了链表中倒数最后 k 个结点所在的位置。
2. **栈法**:我们可以使用一个栈来存储链表中的元素,然后从栈顶开始取出 k 个元素。

下面是双指针法和栈法的具体实现:

### 双指针法

class ListNode:
 def __init__(self, x):
 self.val = x self.next = Nonedef findLastKNode(head, k):
 # 检查链表是否为空或k是否为0 if not head or k ==0:
 return None # 初始化两个指针,分别指向头部和尾部 first = head second = head # 将第一个指针移动k步 for _ in range(k):
 if not second.next:
 return None second = second.next # 将第二个指针移动到链表的尾部 while second.next:
 first = first.next second = second.next # 返回倒数最后 k 个结点所在的位置 return first# 测试代码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 =2result = findLastKNode(head, k)
if result:
 print(result.val) # 输出:4else:
 print("None")


### 栈法
class ListNode:
 def __init__(self, x):
 self.val = x self.next = Nonedef findLastKNode(head, k):
 # 检查链表是否为空或k是否为0 if not head or k ==0:
 return None # 初始化一个栈来存储链表中的元素 stack = []
 # 将链表中的元素压入栈中 while head:
 stack.append(head)
 head = head.next # 从栈顶开始取出 k 个元素 for _ in range(k):
 if not stack:
 return None stack.pop()
 # 返回倒数最后 k 个结点所在的位置 return stack[-1]

# 测试代码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 =2result = findLastKNode(head, k)
if result:
 print(result.val) # 输出:4else:
 print("None")


**总结**

在本题中,我们使用双指针法和栈法来解决链表中倒数最后 k 个结点的问题。双指针法通过维护两个指针,分别指向链表的头部和尾部,然后将第一个指针移动 k 步来找到倒数最后 k 个结点所在的位置。栈法则是使用一个栈来存储链表中的元素,然后从栈顶开始取出 k 个元素。

**注意**

* 在双指针法中,我们需要检查链表是否为空或 k 是否为0,以避免异常情况。
* 在栈法中,我们需要检查栈是否为空,以避免异常情况。
* 在测试代码中,我们使用一个示例链表来演示双指针法和栈法的工作原理。

相关标签:链表数据结构
其他信息

其他资源

Top