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
posted @ 2019-01-30 13:55  youngliu91  阅读(85)  评论(0编辑  收藏  举报