剑指offer(22)——链表中倒数第k个节点

156 阅读1分钟

一、题目描述

题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

二、思路

1、暴力解法

把链表遍历一遍,将所有节点存储在list中,然后取倒数第k个节点即可。这样做的时间复杂度为:O(n),空间复杂度为O(n)。 代码实现:

public static ListNode findKthToTail(ListNode head, int k) {
    ArrayList<ListNode> list = new ArrayList<>();
        while (head != null) {
            list.add(head);
            head = head.
            ;
        }
        int size = list.size();
        if (size == 0 || size - k < 0 || k <= 0) {
            return null;
        }
        return list.get(size - k);
}

2、快慢指针法

让fast指针快slow指针k个节点,那么在fast指针指向末尾null时,则说明slow指针当前已经指向了倒数第K个节点。 这种做法所需的时间复杂度是O(n),空间复杂度为O(1)。

public static ListNode findKthToTail(ListNode head, int k) {
    if(head == null || k == 0){
        return null;
    }
    ListNode p1 = head,p2 = head;
    int i = 0;
    while(i < k){
        if(p1 == null){
            return null;
        }
        p1 = p1.next;
        i++;
    }
    while(p1!=null){
        p1 = p1.next;
        p2 = p2.next;
    }
    return p2;
}