美文网首页
面试题22:链表中倒数第k个节点

面试题22:链表中倒数第k个节点

作者: scott_alpha | 来源:发表于2019-10-07 11:29 被阅读0次

题目:输入一个链表,输出链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6,这个链表的倒数第三个节点是值为4的节点。链表节点定义如下

class ListNode{
    int value;
    ListNode next;
}

思路:构建两个指针P1和P2,P1指针先向前走(k-1)步,然后P2指针开始走,这样P1和P2之间就距离(k-1)。当P1到达尾部的时候,P2指向的节点就是我们要的节点。本题重点考查鲁棒性,要考虑到非法输入情况。
解决方案:

public class Question22 {
    static class ListNode{
        public ListNode(int value){
            this.value = value;
        }
        int value;
        ListNode next;
    }
    public static ListNode findKthToTail(ListNode listHead, int k){
        if (listHead == null || k == 0) return null;
        ListNode head = listHead;
        ListNode behind = null;
        for (int i=0; i<k-1; i++){
            if (head.next != null){
                head = head.next;
            }else {
                return null;
            }
        }
        behind = listHead;
        while (head.next != null){
            head = head.next;
            behind = behind.next;
        }
        return behind;
    }

    public static void main(String[] args) {
        ListNode pHead = new ListNode(1);
        ListNode pAhead = new ListNode(3);
        ListNode pBhead = new ListNode(5);
        ListNode pChead = new ListNode(7);
        pHead.next = pAhead;
        pAhead.next = pBhead;
        pBhead.next = pChead;
        System.out.println(findKthToTail(pHead, 2).value);

    }
}

相关文章

网友评论

      本文标题:面试题22:链表中倒数第k个节点

      本文链接:https://www.haomeiwen.com/subject/ltfmpctx.html