《劍指offer》鏈表中倒數第k個節點

注:此博客不再更新,所有最新文章將發表在個人獨立博客limengting.site。分享技術,記錄生活,歡迎大家關注

題目描述
輸入一個鏈表,輸出該鏈表中倒數第k個結點。

方法一:
思路:倒第k即正第size - k + 1,遍歷鏈表兩次,時間複雜度O(n)

/*
public 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;
        int size = 0;
        ListNode cur = head;
        while (cur != null) {
            size ++;
            cur = cur.next;
        }
        if (k > size) return null;
        cur = head;
        for (int i = 1; i != size - k + 1; i ++) {
            cur = cur.next;
        }
        return cur;
    }
}

方法二:
雙指針,先讓第一個指針和第二個指針都指向頭結點,然後再讓第一個指針走(k-1)步,到達第k個節點。然後兩個指針同時往後移動,當第一個結點到達末尾的時候,第二個結點所在位置就是倒數第k個節點了。

/*
public 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 cur1 = head;
        ListNode cur2 = head;
        for (int i = 1; i != k; i ++) {
            if (cur1.next != null) {
                cur1 = cur1.next;
            } else {
                return null;
            }
        }
        while (cur1.next != null) {
            cur1 = cur1.next;
            cur2 = cur2.next;
        }
        return cur2;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章