從亂序到整潔:Swift 實現奇偶鏈表重排的最佳方案

在這里插入圖片描述
在這里插入圖片描述

文章目錄

    • 摘要
    • 描述
    • 題解答案
    • 題解代碼分析
      • 分段講解
    • 示例測試及結果
    • 時間復雜度
    • 空間復雜度
    • 總結

摘要

在開發中,鏈表結構經常出現在緩存淘汰、操作系統任務調度、或是 LRU 算法中,尤其是對節點位置的靈活操作更是鏈表的強項。LeetCode 第 328 題「奇偶鏈表」就給我們出了一個非常典型的“按位置分組再重組”的鏈表題目。今天我們用 Swift 帶你一步步理清它的邏輯,不僅實現,還要分析每一行代碼的作用。

描述

給定單鏈表的頭節點 head ,將所有索引為奇數的節點和索引為偶數的節點分別分組,保持它們原有的相對順序,然后把偶數索引節點分組連接到奇數索引節點分組之后,返回重新排序的鏈表。

第一個節點的索引被認為是 奇數第二個節點的索引為 偶數 ,以此類推。

請注意,偶數組和奇數組內部的相對順序應該與輸入時保持一致。

你必須在 O(1) 的額外空間復雜度和 O(n) 的時間復雜度下解決這個問題。

示例 1:

輸入: head = [1,2,3,4,5]
輸出: [1,3,5,2,4]

示例 2:

輸入: head = [2,1,3,5,6,4,7]
輸出: [2,3,6,7,1,5,4]

提示:

  • n == 鏈表中的節點數
  • 0 <= n <= 104
  • -106 <= Node.val <= 106

題解答案

我們可以把鏈表分成兩條線:

  • 一條是奇數索引節點組成的鏈;
  • 一條是偶數索引節點組成的鏈;

我們遍歷一遍,把這兩條鏈連起來就搞定了。因為我們只用了幾個額外指針,空間上是 O(1);每個節點最多訪問一次,時間上是 O(n)

題解代碼分析

class ListNode {var val: Intvar next: ListNode?init(_ val: Int) {self.val = valself.next = nil}
}func oddEvenList(_ head: ListNode?) -> ListNode? {guard let head = head, let next = head.next else {return head  // 如果鏈表為空或只有一個節點,直接返回}var odd = head             // 奇數位置的起點var even = next            // 偶數位置的起點let evenHead = even        // 保存偶數起點,最后連接用while let nextOdd = even.next {odd.next = nextOddodd = nextOddeven.next = nextOdd.nextif let nextEven = even.next {even = nextEven}}odd.next = evenHead  // 把奇數鏈的尾巴接上偶數鏈的頭return head
}

分段講解

  1. 初始化階段:
guard let head = head, let next = head.next else { return head }

判斷是否為空鏈表或僅有一個節點,不用處理,直接返回。

  1. 定義指針:
var odd = head
var even = next
let evenHead = even

奇鏈和偶鏈分別以 oddeven 為頭,注意我們還要保留 evenHead,后面連接會用到。

  1. 鏈表分離過程:
while let nextOdd = even.next {odd.next = nextOddodd = nextOddeven.next = nextOdd.nextif let nextEven = even.next {even = nextEven}
}

每一輪迭代,我們都讓 odd 跳兩個節點,even 也跳兩個。直到鏈表末尾。遍歷中奇偶節點自動分組完成。

  1. 拼接兩個鏈表:
odd.next = evenHead

把奇數鏈表的尾部,接上偶數鏈表的頭部。

示例測試及結果

我們來測試下:

// 構建測試鏈表 [1,2,3,4,5]
let node1 = ListNode(1)
let node2 = ListNode(2)
let node3 = ListNode(3)
let node4 = ListNode(4)
let node5 = ListNode(5)node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5// 調用函數
let newHead = oddEvenList(node1)// 打印結果
var current = newHead
while current != nil {print(current!.val, terminator: " ")current = current?.next
}
// 輸出:1 3 5 2 4

時間復雜度

整條鏈表我們只遍歷了一次,每個節點訪問不超過兩次。

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

空間復雜度

只用了固定數量的指針變量,沒有創建新的節點或結構。

  • 空間復雜度: O(1),常數空間。

總結

這道題的關鍵在于兩個鏈表交替構建,同時維護好頭尾指針。在實際開發中,鏈表的拆分與重組很常見,比如分頁展示、批量處理等功能也可能需要對數據鏈按規則拆分。

通過這道題,不僅練習了鏈表的結構操作,還能加深對“指針引用不等于復制”的理解。如果你能寫出無 bug 的鏈表處理代碼,那你對 Swift 的指針語義已經很熟練了!

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

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

相關文章

WPF+CEF 執行JS報錯

WPFCEF 執行JS報錯 在WPF中執行 webBrowser.EvaluateScriptAsync(“window.scrollBy(0, 1000);”); 在部分網站會報異常&#xff1a; Request BrowserId : XXXX not found it’s likely the browser is already closed環境 .Net Framework 4.7 CefSharp.Wpf 131.3.50 解決方案&…

【Python3-Django】快速掌握DRF:ModelViewSet實戰指南

DRF講解 1. 什么是 Django 和 Django REST Framework&#xff1f; 在深入 ModelViewSet 之前&#xff0c;我們先簡單了解一下背景知識&#xff1a; Django 是一個基于 Python 的 Web 開發框架&#xff0c;旨在幫助開發者快速構建安全、可擴展的 Web 應用。它遵循“不要重復自己…

TRAE IDE** 下載、安裝、開發、測試和部署 2048 小游戲的全流程指南

以下是一份完整的 TRAE IDE 下載、安裝、開發、測試和部署 2048 小游戲的全流程指南。整個過程基于 TRAE 作為 AI 輔助編程工具的特性&#xff08;對標 Cursor/AWS Kiro&#xff09;&#xff0c;假設它支持智能代碼生成和云部署功能。 【插播】騰訊云AI Coding大賽https://mar…

重學前端005 --- 響應式網頁設計 CSS 盒子模型

文章目錄BOX 盒子概念CSSoverflow: hidden;filter: blur(3px);box-shadow: 0 0 3px 3px #efb762;border-radius: 30px 25px 60px 12px;transform: rotate(-0.6deg);每個 HTML 元素都是一個盒子&#xff0c;它擁有著自己的間距和邊框。這叫作“盒子模型”。 BOX 盒子概念 內容…

TC500R立式加工中心主軸箱機械結構設計cad【11張】三維圖+設計說明書

TC500R立式加工中心主軸箱機械結構設計 摘 要 數控機床作為工業制造的基礎&#xff0c;在國家的發展中起著非常重要的作用。隨著我國經濟的快速發展&#xff0c;我國已經成為工業制造大國&#xff0c;制造業的發展離不開數控機床&#xff0c;而TC500R立式加工中心作為數控機床…

CSS Grid布局:構建現代網頁的強大網格系統

目錄 一、Grid布局基礎概念 1.1 網格容器與網格項 1.2 創建基本網格 二、核心屬性詳解 2.1 定義網格軌道 2.2 網格間距控制 2.3 網格項對齊方式 三、實戰布局技巧 3.1 創建經典布局 3.2 網格項定位技巧 3.3 響應式網格設計 四、Grid布局 vs Flexbox布局 五、高級…

Elasticsearch / MongoDB / Redis / MySQL 區別

1、一句話簡介名稱核心用途Elasticsearch強大的全文檢索與日志分析引擎MongoDB靈活的文檔數據庫&#xff0c;適合半結構化/結構化數據Redis高性能的內存鍵值緩存數據庫&#xff0c;用于實時高并發處理MySQL經典關系型數據庫&#xff0c;強事務支持&#xff0c;結構化數據持久存…

網絡通信之基礎知識

一、什么是計算機網絡&#xff1f;計算機網絡是指由若干主機、通信鏈路和網絡設備&#xff08;如路由器、交換機等&#xff09;組成的系統&#xff0c;借助通信協議&#xff0c;實現信息共享和資源互聯。其本質是&#xff1a;多臺設備之間通過協議進行數據交換。二、網絡協議與…

Java 設計模式及應用場景

Java 設計模式是解決軟件開發中常見問題的通用方案&#xff0c;通過合理的設計模式可以提高代碼的可維護性、可擴展性和復用性。下面將介紹 Java 中常見的設計模式及其原理。一、設計模式的分類設計模式主要分為三大類&#xff0c;共 23 種經典模式&#xff1a;創建型模式&…

GitHub Jekyll博客本地Win開發環境搭建

GitHub Jekyll博客本地Win開發環境搭建 標簽 后端 blog jekyll 全文鏈接 GitHub Jekyll博客本地Win開發環境搭建 概述 本文詳細介紹了在Windows系統上搭建Jekyll博客本地開發環境的完整步驟&#xff0c;為GitHub Pages博客開發提供本地預覽和調試能力。 環境依賴 Ruby環…

瀏覽器防錄屏是怎樣提高視頻安全性?

文章目錄前言一、什么是瀏覽器防錄屏二、瀏覽器防錄屏的原理是什么&#xff1f;&#xff08;javascript&#xff09;三、如何實現瀏覽器防錄屏總結前言 在數字內容版權保護面臨嚴峻挑戰的今天&#xff0c;瀏覽器防錄屏技術作為視頻安全體系的關鍵一環&#xff0c;其重要性日益…

uni-app項目配置通用鏈接拉起ios應用android應用

uniapp開發ios&android可拉起app的辛酸歷程IOS配置指南1、登錄[apple Developer](https://developer.apple.com/account/resources/identifiers/list)賬戶找到自己開發的對應的項目2、確保對應項目的Associated Domains是打開狀態3、本地創建一個 apple-app-site-associati…

deep learning(李宏毅)--(六)--loss

一&#xff0c;關于分類問題及其損失函數的一些討論。 在構建分類模型是&#xff0c;我們的最后一層往往是softmax函數&#xff08;起到歸一化的作用&#xff09;&#xff0c;如果是二分類問題也可以用sigmoid函數。 在loss函數的選擇上&#xff0c;一般采用交叉熵損失函數(…

Python綁定及其在Mujoco仿真器中的作用

好的&#xff0c;這是一個非常核心且重要的問題。我來分兩部分為你詳細解釋&#xff1a;首先是“什么是Python綁定”&#xff0c;然后是“它在MuJoCo中具體的作用”。第一部分&#xff1a;什么是Python綁定 (Python Binding)&#xff1f; 簡單來說&#xff0c;Python綁定是一座…

數學建模從入門到國獎——備賽規劃優秀論文學習方法

數學建模從入門到國獎——備賽規劃 數學建模國一&#xff1a;我的逆襲經驗分享在大二&#xff0c;我們團隊初次參加媽媽杯&#xff0c;遺憾未獲獎&#xff0c;后來經過5個月的時間&#xff0c;在大三上學期的9月&#xff0c;我們團隊以C題數據挖掘機器學習創新斬獲國賽一等獎&a…

大型語言模型的白日夢循環

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

【Gaussian Haircut論文】在Deepseek和Chatgpt的幫助下慢速了解核心方法

3.Method 一、 1.核心目標 輸入&#xff1a;多張從不同角度拍攝的頭發照片。輸出&#xff1a;3D發型模型&#xff0c;且模型由發絲構成&#xff08;即每根頭發被建模為獨立的曲線/線段&#xff0c;而非體積/網絡&#xff09;。 2.數據預處理 在正式重建前&#xff0c;需要從輸入…

眾趣SDK重磅升級:空間物聯IOT新視界,賦能實景三維場景深度應用

近日&#xff0c;空間數字孿生云服務行業領導者—眾趣科技宣布旗下核心產品云服務平臺Qverse SDK迎來里程碑式升級&#xff01;本次升級聚焦行業前沿需求&#xff0c;重磅推出IoT設備監控系統、iframe跨平臺頁面無縫集成、BI數據智能三大解決方案&#xff0c;旨在將三維空間計算…

021_自然語言處理應用

自然語言處理應用 目錄 NLP應用概述文本理解技術文本生成應用語言分析工具多語言處理專業領域應用實踐案例 NLP應用概述 核心能力范圍 文本理解 語義理解&#xff1a;深度理解文本含義和上下文實體識別&#xff1a;識別人名、地名、機構名等命名實體關系提取&#xff1a;…

小程序中狀態管理Redux

Redux 是一個 集中式 狀態管理框架&#xff0c;所有狀態存儲在一個 全局 Store 中&#xff0c;并通過 Action 觸發 Reducer 進行數據更新。。1.安裝npm install redux miniprogram-computed2.創建// store.js import { createStore } from "redux";// 定義初始狀態 c…