鏈表的倒數第k個節點

題目描述

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

 

題目格式post

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    private int count = 0;
    private ListNode ret;
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null) return null;
        FindKthToTail(head.next,k);
        count ++;
        if(count == k) ret = head;
        return ret;
    }
}

 

解題思路一(比較懶的思路):this

經過遞歸往回推的時候經過一個計數器不斷遞增,若是計數器等於k,那麼咱們就把這個節點保存下來。編碼

 

源代碼:spa

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    private int count = 0;
    private ListNode ret;
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null) return null;
        FindKthToTail(head.next,k);
        count ++;
        if(count == k) ret = head;
        return ret;
    }
}

這個代碼並非很好,由於爲了保存這個節點,我還額外建立了實例變量,這樣的編碼也只能用於作題。code

 

解題思路二(不使用遞歸):blog

好比說咱們一共有5個元素,要求倒數第2個元素,那麼其實就是正向的求第4個元素,也就是(5-2+1)個元素,那麼咱們的第一個元素就須要移動3次遞歸

可是對於鏈表咱們沒法知道它一開始有幾個元素,因此能夠用另一種方法。it

咱們能夠使用2個節點,咱們能夠利用後一個節點的移動的次數來決定前一個元素移動的次數。io

仍是上面這個例子。一共有5個元素(但一開始咱們是不知道的),求倒數第2個元素class

  • 後面那個元素計算次數:只要咱們從從整數第2個元素開始移動,移動到最後一個元素,那麼就移動了3次,那麼這樣咱們就能夠計算出移動的次數啦
  • 前面那個元素: 跟着移動就行了,停下來的時候就是倒數第二個元素了
  • 考慮邊界:若是k不大於0,或者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) {
        ListNode pre = head;
        ListNode post = head;
        
        if(head == null) return null;
        if(k <= 0) return null;
        
        //求出後一個節點該從第幾個元素開始
        for(int i = 0; i < k-1; i++) {
            post = post.next;
            if(post == null) return null;
        }
        while(post.next != null){
            pre = pre.next;
            post = post.next;
        }
        return pre;
    }
}
相關文章
相關標籤/搜索