LeetCode:返回倒數第k個結點

1、題目描述

實現一種算法,找出單向鏈表中倒數第 k 個節點。返回該節點的值。

注意:本題相對原題稍作改動

示例:

輸入: 1->2->3->4->5 和 k = 2
輸出: 4

說明:

給定的?k?保證是有效的。

2、方法1:兩次遍歷

  1. 第一次遍歷:計算鏈表的長度?len

  2. 第二次遍歷:從頭節點開始,移動?len - k?步,到達倒數第?k?個節點。

關鍵步驟
  1. 計算鏈表長度

    • 初始化指針?curr?指向頭節點?head,計數器?len = 0

    • 遍歷鏈表,每移動一次?currlen?加 1,直到?curr?為?null

    • 最終?len?存儲的是鏈表的節點總數。

  2. 定位倒數第 k 個節點

    • 倒數第?k?個節點就是正數第?len - k + 1?個節點。

    • 由于鏈表從?head?開始編號為?1,所以只需移動?len - k?步即可到達目標節點。

    • 例如,鏈表?1->2->3->4->5k=2(倒數第 2 個節點是?4):

      • len = 5len - k = 3

      • 從?head?移動 3 步:1(初始)→?2?→?3?→?4,返回?4

時間復雜度
  • O(n),其中?n?是鏈表的長度。

    • 第一次遍歷計算長度:O(n)

    • 第二次遍歷定位節點:O(n)

    • 總時間:O(2n) = O(n)

空間復雜度
  • O(1),只使用了常數級別的額外空間(curr?指針和?len?變量)。

public static ListNode kthToLast(ListNode head, int k) {ListNode curr = head;int len = 0;// 第一次遍歷:計算鏈表長度 lenwhile (curr != null) {len++;curr = curr.next;}// 第二次遍歷:移動 len - k 步for (int i = 0; i < len - k; i++) {head = head.next;}return head;  // 返回倒數第 k 個節點
}

3、方法2:快慢指針

使用快慢指針(Fast-Slow Pointer)來找到鏈表的倒數第?k?個節點:

  1. 初始化快慢指針fast?和?slow?都指向頭節點?head

  2. 快指針先移動?k-1?步

    • 目的是讓?fast?和?slow?之間相隔?k-1?個節點。

    • 這樣當?fast?到達鏈表末尾時,slow?正好指向倒數第?k?個節點。

  3. 同步移動快慢指針

    • 同時移動?fast?和?slow,每次各移動一步,直到?fast?到達最后一個節點(fast.next == null)。

  4. 返回慢指針

    • 此時?slow?指向的就是倒數第?k?個節點。

關鍵點
  1. 快指針先移動?k-1?步

    • 確保?fast?和?slow?之間的間隔是?k-1

    • 例如,k=2?時,fast?先移動 1 步,指向第 2 個節點,slow?仍在第 1 個節點,兩者間隔 1(即?k-1)。

  2. 同步移動的條件

    • while (fast != null && fast.next != null)

      • fast != null:避免?fast?已經越界(理論上不會發生,因為題目保證?k?有效)。

      • fast.next != null:確保?fast?可以移動到下一個節點(即?fast?不是最后一個節點)。

    • 當?fast?是最后一個節點時(fast.next == null),循環停止,此時?slow?指向倒數第?k?個節點。

時間復雜度
  • O(n),其中?n?是鏈表的長度。

    • 快指針最多移動?n?步(先移動?k-1?步,再同步移動?n-k?步)。

    • 慢指針移動?n-k?步。

    • 總時間:O(n)

空間復雜度
  • O(1),只使用了兩個指針(fast?和?slow),沒有額外空間消耗。

public static ListNode kthToLast2(ListNode head, int k) {ListNode fast = head, slow = head;// 快指針先移動 k-1 步for (int i = 0; i < k - 1; i++) {fast = fast.next;}// 同步移動快慢指針,直到快指針到達最后一個節點while (fast != null && fast.next != null) {fast = fast.next;slow = slow.next;}return slow;  // 慢指針指向倒數第 k 個節點
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904210.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

R004 -計算機硬件基礎

目錄 1.數據表示&計算機網絡組成 2.計算機網絡分類 3.馮諾依曼體系結構 4.指令系統基礎 5.指令系統類型 6.流水線技術 流水線周期 &#xff1a;各流水段中&#xff0c;執行時間最長的那一段。就是T 流水線時間&#xff1a;t 1t2t 3 (n-1) * T 7.流水線指標 8.存儲系…

Mybatis學習(下)

目錄 1. 動態sql的應用 1.2 1.2 1.3 、 、 標簽 1.4 1. 動態sql的應用 使用Mybatis框架時, 對于sql數據的操作量比較大的時候, 看著會覺得很亂, 可能寫著寫著就亂了, 或者說回過頭來發現sql語句寫錯了, 很麻煩, 所以動態sql就可以讓我們用Java代碼, 替換部分sql語句 1.2 &l…

iview 老版本合并單元格

新版的iview中已經支持了合并單元格了&#xff0c;我的版本比較老&#xff0c;為&#xff1a;"iview": "^3.5.2"。暫不支持。記錄一下別的大佬的方法。感覺思路比較活&#xff0c;正在這種思路需要在解決問題的過程中學習。 核心思路&#xff1a;通過rende…

FGMRES(Flexible Generalized Minimal Residual)方法

FGMRES&#xff08;Flexible Generalized Minimal Residual&#xff09;方法是GMRES的變種&#xff0c;主要用于處理變預處理子&#xff08;即每次迭代的預處理子可能不同&#xff09;的情況。與標準GMRES相比&#xff0c;FGMRES通過存儲預處理后的向量而非預處理子本身&#x…

自主采集高質量三維重建數據集指南:面向3DGS與NeRF的圖像與視頻拍攝技巧【2025最新版!!】

一、? 引言 隨著三維重建技術的飛速發展&#xff0c;NeRF&#xff08;Neural Radiance Fields&#xff09;與 3D Gaussian Splatting&#xff08;3DGS&#xff09;等方法成為重建真實場景和物體幾何細節的前沿方案。這些方法在大規模場景建模、機器人感知、文物數字化、工業檢…

HarmonyOS Next-DevEco Studio(5.0.2)無網絡環境配置(詳細教程)

開發者如果電腦處于完全無網環境&#xff0c;可以參考下面文檔進行相關配置 DevEco Studio(5.0.2)開發環境一覽&#xff1a; 工具版本DevEco Studio5.0.2openHarmonySDK14ohpm5.0.11node.js18.20.1hypium1.0.21 一、下載DevEco Studio&#xff08;5.0.2 Release&#xff09;…

MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎樣練成的?

接上文MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 探究sleep.c是如何’煉成’的? 老實講&#xff0c;我不熟悉Makefile&#xff0c;最多寫過簡單的編譯和輔助腳本&#xff0c;拿到Xv6的Makefile是一臉懵的&#xff0c;至今還是一臉懵&#xff0c;那么我們上篇中新加的…

順序結構雙鏈表的實現

雙鏈表是用最快的時間實現鏈表的一種方式&#xff0c;具體的實現代碼如下&#xff1a; #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* next;/…

GoFrame 奉孝學習筆記

第一章節 GoFrame 是一款基礎設施建設比較完善的模塊化框架 GoFrame 是一款基礎設施建設比較完善的模塊化框架, Web Server 模塊是其中比較核心的模塊,我們這里將 Web 服務開發作為框架入門的選擇,便于大家更容易學習和理解。 用GOland編寫代碼 go.mod module goframePro…

pinia實現數據持久化插件pinia-plugin-persist-uni

在學習uniapp過程中&#xff0c;看到了pinia-plugin-persist-uni插件&#xff0c;以前面試過程中也有面試過說vuex數據刷新之前的數據就丟失了&#xff0c;之前回答的是把數據存儲到數據庫或者本地存儲。pinia-plugin-persist-uni本質上數據也是本地存儲。 1、安裝 npm instal…

Git 多賬號切換及全局用戶名設置不生效問,GIT進行上傳無權限問題

解決 Git 多賬號切換及全局用戶名設置不生效問題 在軟件開發過程中&#xff0c;我們經常會使用 Git 進行版本控制。有時&#xff0c;我們需要在同一臺機器上管理多個 Git 賬號&#xff0c;最近我在進行使用git的時候因為項目要進行上傳的不同的git賬號&#xff0c;但是通過本地…

基于STM32定時器中斷講解(HAL庫)

基于STM32定時器中斷講解&#xff08;HAL庫&#xff09; 1、定時器簡單介紹 以STM32F103C8T6中幾個定時器為例&#xff1a; TIM1&#xff1a;這是一個高級定時器&#xff0c;不僅具備基本的定時中斷功能&#xff0c;還擁有內外時鐘源選擇、輸入捕獲、輸出比較、編碼器接口以…

UE5 項目遷移 注意事項記錄

做項目的時候項目越做越大 132g的體量一旦移動復制就耗時間 這個時候遷移派上了用場 前置知識&#xff1a;會使用基本ue遷移流程 以下是遷移注意事項 遷移步驟 首先把項目插件plugins復制粘貼到新項目中其次把.project文本形式 全部復制粘貼新項目中開始遷移項目 選中要遷移的…

套接字+Socket連接

制作加載中動畫&#xff1a; 創建Panel&#xff0c;制作預制體&#xff0c;在Image游戲物體中添加DOTween插件&#xff0c;相關設置如下&#xff1a; (此為DOTween Pro,需付費&#xff0c;也可按下面的數值編寫代碼解決) Socket套接字 套接字就是將IP地址與主機端口號合并在一…

第 11 屆藍橋杯 C++ 青少組中 / 高級組省賽 2020 年真題答和案解析

一、選擇題 第 1 題 單選題 題目:表達式 ‘6’ - ‘1’ 的值是 ( ) A. 整數 5 B. 字符 5 C. 表達式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 碼形式存儲。6 的 ASCII 碼為 54,1 的 ASCII 碼為 49,二者相減結果為 5,是整數類型,因此選 A。 第 2 題 …

使用Rust + WebAssembly提升前端渲染性能:從原理到落地

一、問題背景&#xff1a;為什么選擇WebAssembly&#xff1f; 最近在開發數據可視化大屏項目時&#xff0c;我們遇到了一個棘手的問題&#xff1a;前端需要實時渲染10萬數據點的動態散點圖&#xff0c;使用純JavaScript Canvas方案在低端設備上幀率不足15FPS。經過性能分析&a…

【沐風老師】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一個腳本化的修改器插件。對于需要創建隨機化紋理效果的用戶而言&#xff0c;3DMAX的UV By Element修改器無疑是一款高效工具&#xff0c;它將以偽隨機量偏移、旋轉和/或縮放每個元素的UV坐標。 【版本要求】 3dMax 2016及以上 【安裝方法】…

【神經網絡與深度學習】改變隨機種子可以提升模型性能?

引言 隨機種子在機器學習和數據處理領域中至關重要&#xff0c;它決定了模型訓練、數據劃分以及參數初始化的隨機性。雖然固定隨機種子能確保實驗的可重復性&#xff0c;但改變隨機種子有時會意外提升模型性能。本文將探討這一現象的潛在原因&#xff0c;并揭示隨機性如何影響…

java技術總監簡歷模板

模板信息 簡歷范文名稱&#xff1a;java技術總監簡歷模板&#xff0c;所屬行業&#xff1a;其他 | 職位&#xff0c;模板編號&#xff1a;XDNUTA 專業的個人簡歷模板&#xff0c;邏輯清晰&#xff0c;排版簡潔美觀&#xff0c;讓你的個人簡歷顯得更專業&#xff0c;找到好工作…

OpenLayers:偵聽縮放級別的變化

在實際開發中我們常常需要根據不同的縮放級別設置不同的展示效果或者執行不同的操作&#xff0c;因此偵聽縮放級別的變化就很重要。想要偵聽變化就需要依賴于OpenLayers中的事件系統&#xff0c;下面我將介紹兩個相關的事件。 一、地圖事件 moveend 1.介紹 在地圖的移動結束…