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題
大家如果覺得這篇文章對大家有幫助的話,就請你將它轉發給需要的人吧,順便請大家點個關注和在看吧,創作不易。你們的支持對我真的幫助很大!每天都會爲大家分享一道精選算法題,從簡到難,我們一起堅持下去吧。
程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣
近期精彩內容推薦:
在看點這裏好文分享給更多人↓↓