單向鏈表反轉 如何實現

單向鏈表反轉的實現方法

?

https://www.zhihu.com/question/441865393/answer/3208578798

?

單向鏈表反轉是數據結構中的經典問題,在面試和實際開發中經常遇到。以下是 多種實現方式(包括遞歸和迭代),以 Go 語言為例。


1. 單向鏈表結構定義

type ListNode struct {Val  intNext *ListNode
}

2. 迭代法(推薦)

思路

  • 使用 三個指針 prevcurrnext,逐個反轉節點指向。
  • 時間復雜度 O(n)空間復雜度 O(1)(僅用常量額外空間)。

代碼實現

func reverseList(head *ListNode) *ListNode {var prev *ListNode  // 前驅節點curr := head        // 當前節點for curr != nil {next := curr.Next  // 暫存下一個節點curr.Next = prev   // 反轉指向prev = curr        // prev 后移curr = next        // curr 后移}return prev  // 返回新頭節點
}

示例

輸入: 1 -> 2 -> 3 -> nil  
輸出: 3 -> 2 -> 1 -> nil

3. 遞歸法

思路

  • 遞歸到鏈表末尾,然后逐層反轉指針。
  • 時間復雜度 O(n)空間復雜度 O(n)(遞歸棧開銷)。

代碼實現

func reverseList(head *ListNode) *ListNode {if head == nil || head.Next == nil {return head  // 遞歸終止條件}newHead := reverseList(head.Next)  // 遞歸到末尾head.Next.Next = head              // 反轉指針head.Next = nil                    // 避免循環引用return newHead
}

執行過程

reverseList(1):reverseList(2):reverseList(3): return 32.Next.Next = 2 → 3 -> 22.Next = nil → 3 -> 2 -> nil
1.Next.Next = 1 → 2 -> 1
1.Next = nil → 3 -> 2 -> 1 -> nil

4. 頭插法(利用啞節點)

思路

  • 遍歷鏈表,將每個節點插入到 啞節點(Dummy Node) 之后。
  • 時間復雜度 O(n)空間復雜度 O(1)

代碼實現

func reverseList(head *ListNode) *ListNode {dummy := &ListNode{}  // 啞節點for head != nil {next := head.Next      // 暫存下一個節點head.Next = dummy.Next // 頭插dummy.Next = head      // 更新啞節點指向head = next            // 移動 head}return dummy.Next
}

流程示例

初始: dummy -> nil, 鏈表: 1 -> 2 -> 3 -> nil第1步: dummy -> 1 -> nil  
第2步: dummy -> 2 -> 1 -> nil  
第3步: dummy -> 3 -> 2 -> 1 -> nil

5. 對比總結

方法時間復雜度空間復雜度適用場景
迭代法O(n)O(1)大多數情況(推薦)
遞歸法O(n)O(n)代碼簡潔,但棧溢出風險
頭插法O(n)O(1)需要啞節點輔助

6. 測試用例

func printList(head *ListNode) {for head != nil {fmt.Print(head.Val, " -> ")head = head.Next}fmt.Println("nil")
}func main() {head := &ListNode{1, &ListNode{2, &ListNode{3, nil}}}printList(head)          // 1 -> 2 -> 3 -> nilnewHead := reverseList(head)printList(newHead)       // 3 -> 2 -> 1 -> nil
}

7. 常見問題

Q1:遞歸法的缺點?

  • 鏈表過長時可能導致 棧溢出(Stack Overflow)。
  • 遞歸調用有額外空間開銷。

Q2:如何優化遞歸法?

  • 某些編譯器支持 尾遞歸優化(Tail Call Optimization, TCO),但 Go 目前不支持。

Q3:迭代法為什么更推薦?

  • 無棧溢出風險,適合處理超長鏈表。
  • 空間效率更高(O(1))。

掌握單向鏈表反轉是理解指針操作的基礎,建議手寫實現并測試邊界條件(如空鏈表、單節點鏈表)。

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

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

相關文章

php+vue+Laravel音樂媒體播放及周邊產品運營平臺-nodejs-計算機畢業設計

目錄具體實現截圖課程項目技術路線開發技術介紹設計思路流程PHP核心代碼部分展示詳細視頻演示/源碼獲取##項目介紹網絡技術的廣泛應用顯著地推動了生活服務的信息化進程。結合音樂流媒體與周邊產品的運營需求,構建一套音樂媒體播放及周邊產品運營平臺,成…

Python爬蟲實戰:研究xlwt 和 xlrd 庫相關技術

1. 引言 1.1 研究背景與意義 隨著電子商務的快速發展,電商平臺積累了海量的商品數據。如何從這些數據中提取有價值的信息,為商家提供決策支持,成為電商領域的重要研究方向。傳統人工采集和分析數據的方式效率低下,且容易出現錯誤。自動化數據采集與分析系統能夠通過爬蟲技…

【QGC】深入解析 QGC 配置管理

引言 在軟件開發中,配置管理是一項至關重要的任務,它能幫助我們靈活地管理應用程序的各種參數和設置。QGroundControl(QGC)作為一款強大的開源無人機地面站軟件,其配置管理系統設計精巧,值得我們深入學習。…

ChatGPT,從規則到強化學習

要了解 ChatGPT(Chat Generative Pre-training Transformer),我們不得不先看看 NLP 自然語言處理(Natural Language Processing)。因為 ChatGPT 屬于 NLP 領域,而 NLP 則又是人工智能的一個分支。 那么什么…

【目標檢測之Ultralytics預測框顏色修改】

在 Ultralytics YOLOv8 中修改預測框顏色為紅色,以下是三種實用方案:方案 1:直接修改 plot() 方法的 colors 參數 在調用 results.plot() 時直接指定顏色參數: from ultralytics import YOLO# 加載模型 model YOLO("yolov8n…

讓 VSCode 調試器像 PyCharm 一樣顯示 Tensor Shape、變量形狀、變量長度、維度信息

文章目錄🎯 目標:在 VS Code 調試器中自動顯示這些變量信息🔍 原理簡介?? 其他方案的局限性? 方案一:重寫 __repr__? 方案二:向 debugpy 注冊自定義變量顯示器(StrPresentationProvider)? …

pip國內鏡像源一覽

以下是2025年主流pip國內鏡像源完整清單及配置指南,綜合多個權威來源整理的最新數據:一、核心鏡像源推薦(2025年穩定可用)?阿里云鏡像?https://mirrors.aliyun.com/pypi/simple/優勢:依托阿里云CDN,全國平…

當大模型遇見毫米波:用Wi-Fi信號做“透視”的室內語義SLAM實踐——從CSI到神經輻射場的端到端開源方案

作者 | Blossom.118 2025-07-12 關鍵詞:CSI-SLAM、神經輻射場、毫米波、Transformer、數字孿生、開源 ---- 1. 為什么要“無攝像頭”語義SLAM? ? 隱私紅線:歐盟GDPR 2024修訂版把“攝像頭點云”列入高風險生物特征,落地成本高。…

脈沖神經網絡膜電位泄漏系數學習:開啟時空動態特征提取的新篇章

脈沖神經網絡膜電位泄漏系數學習:開啟時空動態特征提取的新篇章 摘要 脈沖神經網絡(Spiking Neural Networks, SNNs)作為第三代神經網絡模型,憑借其事件驅動、高生物逼真度和潛在的超低功耗特性,已成為類腦計算與高效人…

SSRF(ctfshow)

web351-358這部分的題目都是明文的&#xff0c;按照題目要求繞過就行了<?php error_reporting(0); highlight_file(__FILE__); $url$_POST[url]; $xparse_url($url); if($x[scheme]http||$x[scheme]https){ if(!preg_match(/localhost|127\.0\.|\。/i, $url)){ $chcurl_ini…

亞矩陣云手機:重構物流供應鏈,讓跨境包裹“飛”得更快更準

在跨境電商“時效即生命”的競爭中&#xff0c;物流信息滯后、清關效率低下、成本居高不下已成為商家最頭疼的“三座大山”。傳統模式下&#xff0c;人工更新物流狀態耗時易錯&#xff0c;跨境包裹常因清關延誤遭客戶投訴&#xff0c;而高昂的物流成本更直接吞噬利潤。亞矩陣云…

HTML(5) 代碼規范

HTML(5) 代碼規范 引言 HTML(HyperText Markup Language)是一種用于創建網頁的標準標記語言。HTML5 作為最新的 HTML 標準,自 2014 年正式發布以來,已經成為了構建現代網頁應用的基礎。本文將詳細介紹 HTML5 代碼規范,包括結構、語法、屬性以及最佳實踐等內容,旨在幫助…

【PTA數據結構 | C語言版】順序棧的3個操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將 n1 個整數順序壓入容量為 n 的棧&#xff0c;隨后執行 n1 次取頂并出棧的操作。 輸入格式&#xff1a; 輸入首先在第一行給出正整數 n&#xff08;≤10^4 &#xff09;&a…

使用Pycharm集成開發工具遠程調試部署在虛擬機上的flask項目:超級詳細的完整指南

本文將詳細介紹如何通過PyCharm Professional版遠程調試部署在虛擬機(這里以Ubuntu為例)中的Flask項目。這種開發方式特別適合需要在接近生產環境調試的場景。 虛擬機網絡配置 這里用到的是VMware的NAT&#xff0c;即網絡地址轉換模式&#xff0c;要保證你Linux虛擬機的IP&…

UE制作的 AI 交互數字人嵌入到 Vue 開發的信息系統中的方法和步驟

要將 UE(Unreal Engine,虛幻引擎)制作的 AI 交互數字人嵌入到 Vue 開發的信息系統首頁中運行,可以參考以下方法步驟以及涉及的軟件工具: 準備工作 軟件工具 Unreal Engine:用于創建和編輯 AI 交互數字人,需要在 UE 中完成數字人的建模、綁定骨骼、添加 AI 交互邏輯等工…

基于elementUI的el-autocomplete組件的自動補全下拉框實踐

<template><div :class"$options.name"><el-autocompletestyle"width: 100%"ref"autocomplete":popper-class"${$options.name}-el-autocomplete"v-model"inputSearchValue":placeholder"輸入關鍵詞...…

Gameplay - 獨立游戲Celeste的Player源碼

TGA2018最佳獨立游戲《蔚藍》的一些公開代碼&#xff1b;主要是Player部分的代碼&#xff1a;using System; using System.Collections; using System.Collections.Generic; using Monocle; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input;namespace Cel…

基于大模型的鼻咽癌全周期預測及診療優化研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 國內外研究現狀 1.3 研究目標與創新點 二、大模型技術與鼻咽癌相關理論基礎 2.1 大模型技術概述 2.2 鼻咽癌疾病知識 2.3 大模型在醫學領域的應用 三、數據收集與預處理 3.1 數據來源 3.2 數據清洗 3.3 數據標注 3.4 數據標…

基于odoo17的設計模式詳解---訪問模式

大家好&#xff0c;我是你的Odoo技術伙伴。想象一下&#xff0c;我們有一個復雜的對象結構&#xff0c;比如一個由不同類型的訂單行&#xff08;銷售行、折扣行、備注行&#xff09;組成的銷售訂單。現在&#xff0c;我們需要對這個結構執行一些新的操作&#xff0c;比如&#…

使用langgraph 構建RAG 智能問答代理

RAG 智能問答代理&#xff1a; ? 支持用戶持續提問 ? 根據模型判斷是否需要查資料 ? 自動調用 PDF 檢索工具查找內容 ? 自動引用內容回答 ? 可以輸入 exit / quit 退出 下載需要的library pip install langchain-google-genai pip install langgraph pip install langchai…