剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解
題目來源:牛客網-劍指Offer專題
題目地址:鏈表中倒數第k個結點
題目描述
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
節點結構如下:
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;} }題目解析
這是一道和鏈表相關的題,對于這種題目,在熟悉鏈表的基本操作解決基本問題之余,也一定要記得處理空指針之類的有可能造成程序異常終止的情況,不要貪圖方便(尤其是那些前競賽選手 )。
方法一:
這是一種最常規的方法,先遍歷一次鏈表求出鏈表的的長度 lenlenlen,然后將倒數第 k 個節點轉換為順數第len-k個節點,最后第二次遍歷去求解即可。
方法二:
其實我們只需要進行一次遍歷操作就可以求出需要的答案,網上很多人把這個稱之為“快慢指針法”,即讓慢指針在快指針移動 kkk 個節點后再開始移動,當快指針移動到鏈表末尾(null)時,慢指針就到達了倒數 kkk 個節點。
聽起來有點玄乎?請聽我細細道來~
如下圖所示,由于我們最后到達的是末端(null),那我們就從末端開始移動 kkk 個節點,就到達了我們的倒數第 kkk 個節點,也就是我們的目標 targettargettarget。最后再從 targettargettarget 移動到慢指針 slowslowslow 的位置。
現在,我們把部分過程逆轉過來,我們要從 slowslowslow 移動到慢指針 targettargettarget 的位置。問題是我們又不知道要移動多少個節點,暫時設為 xxx ,于是有
x+k=lenx+k=lenx+k=len
我們讓快指針先移動了 kkk 個節點,再讓慢指針和快指針一起移動,實際上就是用快指針去度量鏈表的長度 lenlenlen,將慢指針移動的距離限定為 x=len?kx=len-kx=len?k 個節點。
本文為原創,作者博客地址為:Veggie的博客
如果本文對你有所幫助,要記得點贊哦~
總結
以上是生活随笔為你收集整理的剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指Offer #13 调整数组顺序使奇
- 下一篇: 手撕设计模式之「单例模式」(详细解析)