剑指offer 链表中倒数第k个结点

剑指offer题型分类及各题的代码及解题思路

题目描述

输入一个链表,输出该链表中倒数第k个结点。

 

分析:(来自剑指offer 第二版P137)

方法:双指针法

设置两个指针,first,last,先让first走k-1步,然后再一起走,直到first指向最后一个结点时,last即为倒数第k个节点。

注意:

  • 输入的pListHead可能为NULL。由于代码试图访问空指针指向的内存,从而造成程序崩溃。
  • 输入的以pListHead为头结点的链表的结点总数可能少于k。由于在for循环中会在链表上向前走k-1步,仍然会由于空指针造成程序崩溃。
  • 输入的参数k可能为0。由于k是一个无符号整数,for循环中k-1得到的不是-1,而是无符号的0xffff ffff。因此,for循环执行次数远超我们的预计,同样也会造成程序崩溃。

针对前面的问题,我们先要判断头指针和k值情况,之后在for循环first走k-1步过程中,每走一步,都要判断一下,first下一个结点是否为NULL。

C++实现代码如下:

ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) 
{
	ListNode* first = pListHead;
	ListNode* last = pListHead;

	if (pListHead == NULL || k == 0)    //若头结点为NULL或k==0,直接返回NULL.
		return NULL;

	for (int i = 1; i < k; ++i)    //先让first指针走k-1步.
	{
		if (first->next != NULL)    //若first不为最后一个结点,则继续往后走
			first = first->next;
		else    //否则,返回NULL
			return NULL;
	}

	while (first->next != NULL)    //第k步,两个指针同时往后走,直至first指向最后一个结点
	{
		first = first->next;
		last = last->next;
	}

	return last;    //返回倒数第k个结点
}

 

你可能感兴趣的:(剑指offer刷题)