剑指 offer 笔记 14 | 链表中倒数第k个结点

2019-06-16  本文已影响0人  ProudLin

题目描述
输入一个链表,输出该链表中倒数第 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》

上一篇 下一篇

猜你喜欢

热点阅读