日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來源:牛客網-劍指Offer專題
題目地址:鏈表中倒數第k個結點

題目描述

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

節點結構如下:

public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;} }

題目解析

這是一道和鏈表相關的題,對于這種題目,在熟悉鏈表的基本操作解決基本問題之余,也一定要記得處理空指針之類的有可能造成程序異常終止的情況,不要貪圖方便(尤其是那些前競賽選手 )。

方法一:
這是一種最常規的方法,先遍歷一次鏈表求出鏈表的的長度 lenlenlen,然后將倒數第 k 個節點轉換為順數第len-k個節點,最后第二次遍歷去求解即可。

public class Solution {public ListNode FindKthToTail(ListNode head, int k) {if (head == null || k < 1)return null;int len = 0, i = 0;//計算鏈表長度ListNode p = head;while (p != null) {p = p.next;len++;}//如果k比len還大,就直接返回nullif (k > len) {return null;}//找倒數第k個節點(其實就是順數第len-k個節點)p = head;while (i < len - k) {p = p.next;i++;}return p;} }

方法二:
其實我們只需要進行一次遍歷操作就可以求出需要的答案,網上很多人把這個稱之為“快慢指針法”,即讓慢指針在快指針移動 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 個節點。

public class Solution {public ListNode FindKthToTail(ListNode head, int k) {if (head == null || k < 1)return null;ListNode p, q;p = q = head;int i = 0;for (; p != null; i++) {if (i >= k) {//快指針移動了k個節點后,慢指針開始移動q = q.next;}//快指針需要一直移動p = p.next;}return i < k ? null : q;} }

本文為原創,作者博客地址為:Veggie的博客
如果本文對你有所幫助,要記得點贊哦~

總結

以上是生活随笔為你收集整理的剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。