劍指offer最優(yōu)解Java版-鏈表中倒數(shù)第k個結(jié)點

劍指offer專題地址

劍指offer索引地址

題目描述

輸入一個鏈表,輸出該鏈表中倒數(shù)第k個結(jié)點。

第一種方案

先遍歷鏈表獲取長度,然后再次遍歷鏈表輸出倒數(shù)第k個結(jié)點。

class ListNode {
    int val;
    ListNode next = null;

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

public class Solution {
    public ListNode FindKthToTail(ListNode head, int k) {
        if (head == null) {
            return null;
        }
        int count = 1;
        ListNode cur = head;
        while (cur.next != null) {
            count++;
            cur = cur.next;
        }
        cur = head;
        if (k > count) {
            return null;
        }
        for (int i = 0; i < count - k; i++) {
            cur = cur.next;
        }
        return cur;
    }
}

復(fù)雜度分析:

  • 時間復(fù)雜度:O(n)。
  • 空間復(fù)雜度:O(1)。

第二種方案

兩個指針,先讓第一個指針和第二個指針都指向頭結(jié)點,然后再讓第一個指正走(k-1)步,到達第k個節(jié)點。然后兩個指針同時往后移動,當?shù)谝粋€結(jié)點到達末尾的時候,第二個結(jié)點所在位置就是倒數(shù)第k個節(jié)點了。

class ListNode {
    int val;
    ListNode next = null;

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

public class Solution {
    public ListNode FindKthToTail(ListNode head, int k) {
        if (head == null || k <= 0) {
            return null;
        }
        ListNode pre = head;
        ListNode last = head;
        for (int i = 1; i < k; i++) {
            if (pre.next != null) {
                pre = pre.next;
            } else {
                return null;
            }
        }
        while (pre.next != null) {
            pre = pre.next;
            last = last.next;
        }
        return last;
    }
}

復(fù)雜度分析:

  • 時間復(fù)雜度:O(n)。
  • 空間復(fù)雜度:O(1)。
哎呀,如果我的名片丟了。微信搜索“全菜工程師小輝”,依然可以找到我
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容