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

题目描述

输入一个链表,输出该链表中倒数第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;    
    }
}  
原文地址:https://www.cnblogs.com/zywu/p/5770517.html