老鷹:我要抓走倒數第K個小雞

Python實戰社羣

Java實戰社羣

長按識別下方二維碼,按需求添加

掃碼關注添加客服

進Python社羣▲

掃碼關注添加客服

進Java社羣

作者丨程序員愛做飯

來源丨袁廚的算法小屋(ID:tan45dume)

題目描述:鏈表中倒數第k個節點

輸入一個鏈表,輸出該鏈表中倒數第k個節點。爲了符合大多數人的習慣,本題從1開始計數,即鏈表的尾節點是倒數第1個節點。例如,一個鏈表有6個節點,從頭節點開始,它們的值依次是1、2、3、4、5、6。這個鏈表的倒數第3個節點是值爲4的節點。

示例:

給定一個鏈表: 1->2->3->4->5, 和 k = 2.

返回鏈表 4->5.

說明:這個題目是讓我們找出鏈表的倒數第K個節點,做這個題目之前需要了解鏈表的性質

題目分析:

先把手機蓋上自己想想思路哦

              

我們遇到這個題目,可能會有什麼答題思路呢?

是不是會想到先遍歷一遍鏈表,知道鏈表節點的個數,然後再遍歷一遍得出倒數第n個節點。

比如鏈表長度爲10,倒數第3個節點,不就是正數第8個節點呀,這種方法當然可以啦,是可以實現的,那麼我們再思考一下有沒有其他方法呢?哦,對,我們可以將鏈表元素保存到數組裏面,然後直接就可以知道倒數第K個節點了。這個方法確實比剛纔那個方法省時間了,但是所耗的空間更多了,那我們還有什麼方法可以一次遍歷,然後空間複雜度爲O(1)呢?

我們可以繼續利用我們的雙指針呀,但是我們應該怎麼做呢?

雙指針法:

首先一個指針移動K-1位(這裏可以根據你的初始化指針決定),然後另一個指針開始啓動,他倆移動速度一樣,所以他倆始終相差K-1位,當第一個指針到達鏈表尾部時,第二個指針的指向則爲倒數第K個節點。

倒數k個節點

感覺這個方法既巧妙又簡單,大家可以自己動手打一下,這個題目是經典題目哦。

class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        //特殊情況
        if(head==null){
            return head;
        }
        //初始化兩個指針
        ListNode pro = new ListNode(-1);
        ListNode after = new ListNode(-1);
        //定義指針指向
        pro = head;
        after = head;
        //先移動綠指針到指定位置
        for(int i =0;i<k-1;i++){
            pro=pro.next;
        } 
        //兩個指針同時移動
        while(pro.next!=null){
            pro=pro.next;
            after=after.next;
        }
        //返回倒數第k個節點
        return after;
    }
}

題目來源:leetcode  劍指offer22題

大家如果覺得這篇文章對大家有幫助的話,就請你將它轉發給需要的人吧,順便請大家點個關注在看吧,創作不易。你們的支持對我真的幫助很大!每天都會爲大家分享一道精選算法題,從簡到難,我們一起堅持下去吧。

程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣


近期精彩內容推薦:  

 朋友入職中軟一個月(外包華爲)就離職了!

 再見,胡阿姨!再見,共享單車!

 一代經典銷聲匿跡:WinXP徹底再見了!

 2021年1月編程語言排行榜


在看點這裏好文分享給更多人↓↓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章