首页 > 其他 > 详细

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

时间:2016-08-14 17:51:10      阅读:306      评论:0      收藏:0      [点我收藏+]

题目描述

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

 

技术分享

 

public class Test {
    
    class ListNode {
        int value;
        ListNode next;
        public ListNode(int value) {
            this.value = value;
        }
    }
    
    public static void main(String[] args) {
        Test t = new Test();
        ListNode node1 = t.new ListNode(1);
        ListNode node2 = t.new ListNode(2);
        ListNode node3 = t.new ListNode(3);
        ListNode node4 = t.new ListNode(4);
        ListNode node5 = t.new ListNode(5);
        ListNode node6 = t.new ListNode(6);
        ListNode node7 = t.new ListNode(7);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        node6.next = node7;
        node7.next = null;
        ListNode kThNode = t.findKthToTail(node1, 2);
        
        System.out.println(kThNode.value);
    }
    
    /**
     * 一次遍历找到倒数第k个节点
     * @param head
     * @param k  k从1开始
     * @return
     */
    public ListNode findKthToTail(ListNode head, int k) {
        // 输入的链表不能为空, k要大于0:  k从1开始,小于0没有意义
        if(head == null || k <= 0) return null;

        ListNode pForward = head; 
        ListNode pBehind = null;
        
        // 第一个指针先向前走k-1.
        for(int i=0; i<k-1; i++) {
            // 如果k大于节点数,next可能指向空 ,返回空
            if(pForward.next == null)
                return null;
            pForward = pForward.next;
        }
        // 第二个指针暂时不动
        pBehind = head;
        
        // 两个指针一起移动
        // 当前面一个指针遍历到最后一个节点,此时后面一个指针刚好指向倒数第k个节点
        while(pForward.next != null) {
            pForward = pForward.next;
            pBehind = pBehind.next;
        }
        return pBehind;    
    }
}  

 

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

原文:http://www.cnblogs.com/zywu/p/5770517.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!