美文网首页剑指offer
链表中倒数第k个结点

链表中倒数第k个结点

作者: G_uest | 来源:发表于2019-08-11 22:16 被阅读0次

题目来源:牛客网--链表中倒数第k个结点

题目描述

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

解题思路

整体思路就是两步走,两人刚开始都是1,
第一个人走到K+1时,第二个人也开始走,两个人速度一样。
当第一个人走完时,第二个人刚好比第一个人慢了 K

提交代码

// 整体思路就是两步走,两人刚开始都是1,
// 第一个人走到K+1时,第二个人也开始走,两个人速度一样。
static ListNode method(ListNode head, int k) {
    // 非法输入
    if (k <= 0 || head == null) {
        return null;
    }

    ListNode result = head;
    ListNode current = head;
    int i = 1;
    for (; current != null; i++) {
        // 如果current已经走到了第 K+1 个,result开始往后移
        // 因为 result 本来就指向第 1 个
        if (i > k) {
            result = result.next;
        }
        // 链表向后移动
        current = current.next;
    }
    return i > k ? result : null;
}

本地测试代码

public class FindKthToTail {
    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode current = head;
        // 生成长度为5的链表
        for (int i = 2; i <= 5; i++) {
            current.next = new ListNode(i);
            current = current.next;
        }
        System.out.println(method(head,0).val);
    }
    
    // 整体思路就是两步走,两人刚开始都是1,第一个人走到K+1时,第二个人也开始走,两个人速度一样。
    static ListNode method(ListNode head, int k) {
        // 非法输入
        if (k <= 0 || head == null) {
            return null;
        }

        ListNode result = head;
        ListNode current = head;
        int i = 1;
        for (; current != null; i++) {
            // 如果current已经走到了第 K+1 个,result开始往后移
            // 因为 result 本来就指向第 1 个
            if (i > k) {
                result = result.next;
            }
            // 链表向后移动
            current = current.next;
        }
        return i > k ? result : null;
    }
}

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

相关文章

网友评论

    本文标题:链表中倒数第k个结点

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