题目描述
输入一个链表,输出该链表中倒数第 k 个结点。
描述分析
这道题涉及代码鲁棒性,所谓鲁棒性就是健壮性,是否能对异常条件处理妥当,简单地说就是要考虑,代码再特殊条件下能否正常运行,而不是崩溃。
题目描述,其实隐藏着另一个条件,即链表中节点的个数不能大于 K。假设我们输入的 K 大于链表的节点,那么该怎么处理?
假如我们输入的节点依次为 1、2、3、4、5、6 那么倒数第 2 个节点为 5 节点。而且这道题要求只遍历一次,找到倒数第 K 个节点。
我们可以定义两个指针,第一个指针 p1 ,从链表头指针开始走 k-1 步,第二个指针p2 保持不动;
到第 k 步开始,p2 也从链表头指针开始遍历,两个指针的距离保持 k -1 步,当 p1 到达链表尾节点时,p2 指针正好指向倒数第 k 个节点。
代码分析
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k == 0){
return null;
}
ListNode pA = head;
ListNode pB = null;
for(int i = 0; i < k-1; i++){
if(pA.next != null){
pA = pA.next;
}else{
return null;
}
}
pB = head;
while(pA.next != null){
pA = pA.next;
pB = pB.next;
}
return pB;
}
}
1)要考虑链表为空的情况;
2)考虑当 k 输入为 0 的情况;
3)考虑 k 如果大于链表长度时;
参考文献:《剑指offer》