题目描述
本题收获:考虑问题要全面,保持代码的鲁棒性(健壮性)。
提高代码的鲁棒性的有效途径是进行防御性编程。
防御性编程 是 一种编程习惯,是指预见在什么地方可能会出现问题,并为这些可能出现的问题制定处理方式。
本题需要考虑的注意事项:
1、考虑传入的头指针为NULL;
2、考虑链表结点总数 少于 k;
3、考虑输入的 k 值小于等于0;
这三点一定要考虑,防止潜在的崩溃风险。
相关题目,可做思考:
1、求链表的中间结点。如果链表中结点总数为奇数,返回中间结点;若结点总数是偶数,返回中间结点的任意一个。
为了解决这个问题,我们可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。当走的快的指针走到链表的末尾时,走的慢的指针正好在链表的中间。
2、判断一个单向链表是否形成了环形结构。
和前面的问题一样,定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快得指针走到了链表的末尾(即pNext->NULL)都没有追上第一个指针,那么链表就不是环形链表。
通过这两个相关题目的解决思路,可以看出当我们用一个指针遍历链表不能解决问题时,可以尝试用两个指针来遍历链表,一个走得快些,另一个慢些。
因此对于本题,寻找倒数第k个结点,也可以这样做:
定义两个指针,第一个指针从链表的头指针开始遍历向前走 k-1,第二个指针保持不动,从第 k 步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在 k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第 k 个结点。