22 链表中倒数第 K 个结点
题目
输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。
C++ 题解
为了能够只遍历一次就能找到倒数第k个节点,可以定义两个指针:
- 第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;
- 从第k步开始,第二个指针也开始从链表的头指针开始遍历;
- 由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。
注意:
当我们用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表。
可以让其中一个指针遍历的速度快一些(比如一次在链表上走两步),或者让它先在链表上走若干步。
ListNode * FindKthToTail(ListNode * pListHead, unsigned int k)
{
if (pListHead == nullptr || k == 0)
return nullptr;
ListNode* pAhead = pListHead;
ListNode* pBhead = pListHead;
for (unsigned int i = 0; i < k - 1; i++)
{
if (pAhead->m_pNext != nullptr)
{
pAhead = pAhead->m_pNext;
}
else
{
// 特别需要注意此处,链表长度不够k-1
return nullptr;
}
}
while (pAhead->m_pNext != nullptr)
{
pAhead = pAhead->m_pNext;
pBhead = pBhead->m_pNext;
}
return pBhead;
}
python 题解
思路与C++题解一致:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k<=0:
return None
pAhead=head
pBehind=None
for i in range(k-1):
if pAhead.next:
pAhead=pAhead.next
else:
return None
pBehind=head
while pAhead.next:
pAhead=pAhead.next
pBehind=pBehind.next
return pBehind