【剑指offer-Java版】15链表中倒数第K个结点

链表中倒数第K个结点:快慢指针解决

需要注意的地方是
1) 可能会存在输入的链表大小小于k
2) 输入的k可能小于等于0 - 所以必须限定k大于0


    public class _Q15 {

    public ListNode FindKthToTail(ListNode head, int k){

        if(head == null || k < 1) return null;

        ListNode pre = head.next;
        ListNode after = head.next;

        int count = 0;
        while(count++ < k && pre != null){
            pre = pre.next;
        }

        if(count < k) return null; // 链表结点个数小于k

        while(pre != null){ // 一直到pre == null的时候,after就是所求
            pre = pre.next;
            after = after.next;
        }

        return after;
    } 
    }

测试代码:


    public class _Q15Test extends TestCase {

    _Q15 K = new _Q15();

    public void test(){
        ListNode head = new ListNode();

        ListNode node1 = new ListNode();
        ListNode node2 = new ListNode();
        ListNode node3 = new ListNode();
        ListNode node4 = new ListNode();

        node1.value = 1;
        node2.value = 2;
        node3.value = 3;
        node4.value = 4;

        head.next = node1;
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = null;

        int k1 = 1;
        int k2 = 10;
        int k3 = 2;
        int k4 = 4;
        int k5 = 0;
        ListNode result;
        /*
         * 4 
         * NULL 
         * 3 
         * 1 
         * NULL 
         * NULL
         */
        result = K.FindKthToTail(head, k1);
        if(result != null) System.out.println(result.value); else System.out.println("NULL");

        result = K.FindKthToTail(head, k2);
        if(result != null) System.out.println(result.value); else System.out.println("NULL");

        result = K.FindKthToTail(head, k3);
        if(result != null) System.out.println(result.value); else System.out.println("NULL");

        result = K.FindKthToTail(head, k4);
        if(result != null) System.out.println(result.value); else System.out.println("NULL");

        result = K.FindKthToTail(head, k5);
        if(result != null) System.out.println(result.value); else System.out.println("NULL");

        result = K.FindKthToTail(null, k1);
        if(result != null) System.out.println(result.value); else System.out.println("NULL");
    }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值