Acwing算法基礎課--鏈表

一、單鏈表

AcWing 826. 單鏈表

代碼

N = 100010
idx = 0
e = [0] * N
ne = [0] * N
head = -1def init():global idx,headidx = 0head = -1def add_head(x):global idx,heade[idx] = xne[idx] = headhead = idxidx += 1def delete(k):ne[k] = ne[ne[k]]def add_k(k,x):global idxe[idx] = xne[idx] = ne[k]ne[k] = idxidx += 1def _print():i = headwhile i != -1:print(e[i],end=" ")i = ne[i]if __name__ == "__main__":m = int(input())init()for _ in range(m):op = list(input().split())if op[0] == 'H':add_head(int(op[1]))elif op[0] == 'D':k = int(op[1])if k == 0:head = ne[head]delete(k-1)else:add_k(int(op[1])-1, int(op[2]))_print()

解析

1、head 的作用

  • head 是鏈表的入口指針。

  • 初始時 head = -1,表示鏈表為空。

  • 當鏈表有元素時,head 保存第一個節點的下標。

  • 遍歷鏈表時,從 head 出發,通過 ne[idx] 不斷找到下一個節點,直到遇到 -1 結束。


2、關于 k-1 的問題

  • 題意:將 x 插入到第 k 個插入的數后面。

  • 實現時,數組下標是從 0 開始的,所以第 k 個插入的數下標是 k-1

  • 因此調用時是 add(k-1, x)remove(k-1)

  • 如果初始化時 idx=1(而不是0),下標和 k 可以對齊,就不需要 k-1


3、e[idx]、ne[idx] 與 idx 的關系

  • 結點定義:鏈表的元素由 (e[idx], ne[idx]) 兩部分組成。

  • e[idx]:編號為 idx 的節點存儲的值。

  • ne[idx]:編號為 idx 的節點的下一個節點下標。

  • idx 本身只是一個編號(不一定連續),節點順序要通過 ne 串聯起來。


4、刪除頭節點 head = ne[head]

  • 刪除的其實是鏈表的首元結點(第一個存值的結點)。

  • 操作原理:把 head 移動到原來 head 的下一個節點,即 ne[head]

  • 這樣就跳過了原首元結點,等價于刪除它。


5、為什么最后一個節點的 ne[idx] = -1

  • 初始時 head = -1,表示空鏈表。

  • 插入第一個元素時:e[0] = valne[0] = -1head = 0

  • 后續插入時,新節點的 ne[new] = head,再更新 head = new

  • 因為鏈表是靠 ne 串起來的,所以最后一個節點始終指向 -1,表示鏈表結束。

二、雙向鏈表

AcWing 827. 雙鏈表

代碼

N = 100010
l = [0] * N
r = [0] * N
e = [0] * N
idx = 0def init():global idxr[0] = 1l[1] = 0idx = 2def delete(k):r[l[k]] = r[k]l[r[k]] = l[k]# 往k的右端插入  
def insert(k,x):global idxe[idx] = xr[idx] = r[k]l[idx] = kl[r[k]] = idxr[k] = idxidx += 1if __name__ == "__main__":m = int(input())init()for _ in range(m):op = list(input().split())if op[0] == "L":x = int(op[1])insert(0,x)elif op[0] == "R":x = int(op[1])insert(l[1],x)elif op[0] == "D":k = int(op[1])delete(k+1)elif op[0] == "IL":k = int(op[1])x = int(op[2])insert(l[k+1],x)else:k = int(op[1])x = int(op[2])insert(k+1,x)i = 0res = []while r[i] != 1:val = e[r[i]]res.append(val)i = r[i]print(" ".join(map(str,res)))

解析

  1. 數組設計

    • e[idx]:存放編號為 idx 的節點的值。

    • l[idx]:存放編號為 idx 的左指針(前驅節點下標)。

    • r[idx]:存放編號為 idx 的右指針(后繼節點下標)。

  2. 哨兵節點(邊界節點)

    • 下標 0 表示鏈表的 左端點(不存值)。

    • 下標 1 表示鏈表的 右端點(不存值)。

    • 初始化時:

      r[0] = 1 # 左端點指向右端點
      l[1] = 0 # 右端點指向左端點
      idx = 2 # 有效數據節點從下標 2 開始

  3. 傳入函數時要用 k+1

    • 哨兵占用了下標 0 和 1

      • 下標 0:左端點(不存值)。

      • 下標 1:右端點(不存值)。

      • 所以真正存數據的節點是從 idx = 2 開始。

    • 題目里的第 k 個插入操作 vs 實際數組下標

      • 第 1 次插入得到的節點,邏輯上是“第 1 個元素”,但它的數組下標是 2

      • 一般情況:第 k 個插入的元素對應數組下標 k+1

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

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

相關文章

AI表征了西方的有界,AI+體現了東方的無界

AI表征了西方的有界,AI體現了東方的無界,試圖通過文化差異的視角來對比傳統AI(AI)與增強型或融合型AI(AI)的特征。一、“AI表征了西方的有界”西方的“有界”可以理解為:1、邏輯清晰、結構嚴謹&…

LabVIEW泵輪檢測

?在現代制造業蓬勃發展的浪潮下,汽車行業也迎來了高速發展期。液力變矩器作為實現車輛自動變速的關鍵零件產品,在汽車動力系統中扮演著不可或缺的角色。泵輪作為液力變矩器的核心組成部分,其生產質量直接影響著液力變矩器的性能。因此&#…

RT-DETRv2 中的坐標回歸機制深度解析:為什么用 `sigmoid(inv_sigmoid(ref) + delta)` 而不是除以圖像尺寸?

引言:一個看似簡單的公式,背后藏著工業級設計智慧 在閱讀 RT-DETRv2(Real-Time DETR v2)源碼時,我曾被一行代碼深深震撼: inter_ref_bbox F.sigmoid(bbox_head[i](output) inverse_sigmoid(ref_points_de…

簡單了解一下GraphRAG

傳統RAG的缺點 當我們將一段文本信息以句子分割后,存入到向量數據庫中。用戶提問“老王喜歡吃什么”,這個問題會與向量數據庫中的許多句子關聯性比較強,能返回準確且具體的信息。 但是,若是問題換成“出現了幾次西瓜”&#xff0c…

HTTP 狀態碼背后的邏輯:從請求到響應的完整流程解析(含完整流程圖)

在日常的 Web 開發與 API 調試中,我們經常會遇到各種 HTTP 狀態碼 ——404 Not Found、401 Unauthorized、500 Internal Server Error... 這些數字背后并非隨機出現,而是服務器處理請求過程中不同階段的 "反饋信號"。理解這些狀態碼的觸發邏輯…

Vue:下拉框多選影響行高

目錄 一、 出現場景二、 解決方案 一、 出現場景 在使用el-select增加multiple屬性進行多選時&#xff0c;會出現高度塌陷的情況 二、 解決方案 首先需要在el-select中增加collapse-tags屬性&#xff0c;并在style中增加如下樣式 方案一 <style scoped> ::v-deep .e…

如何在高通躍龍QCS6490 Arm架構上使用Windows 11 IoT企業版?

1.簡介研華已將高通躍龍QCS6490 技術應用于嵌入式模塊、單板電腦和AI攝像頭等各種規格的嵌入式硬件中。QCS6490平臺支持全面的操作系統生態系統&#xff0c;包括Windows、Ubuntu、Yocto和 Android。Windows 11 IoT企業版是微軟新一代的物聯網操作系統&#xff0c;具有更強的安全…

阿里云國際代理:如何利用RDS構建高可用、可擴展的數據庫架構

講下云數據庫RDS案例解析&#xff0c;若在上云或用云過程中有不懂的&#xff0c;可尋云樞國際yunshuguoji助力免卡上云用云。1、RDS MySQL數據庫代理支持讀寫分離、連接保持、就近訪問、事務拆分、連接池、SSL加密等功能&#xff0c;能夠降低主實例負載&#xff0c;提高實例可用…

C++之特殊類設計

文章目錄前言一、 設計一個不能被拷貝的類1. C98 實現方式2. C11 實現方式二、設計一個只能在堆上創建對象的類1. 方法一&#xff1a;析構函數私有&#xff0c;提供destory接口釋放資源2. 方法二&#xff1a;構造函數私有三、 設計一個只能在棧上創建對象的類1. 實現方式四、設…

TupiTube,一款免費開源的 2D 動畫創作工具

TupiTube&#xff0c;一款免費開源的 2D 動畫創作工具 ** ** 功能 ** &#xff1a;開源、免費的 2D 動畫軟件&#xff0c;界面簡單&#xff0c;支持逐幀動畫、剪紙動畫、定格動畫&#xff0c;能導入素材并導出多種視頻和圖片格式&#xff0c;適合兒童、學生和動畫愛好者入門創作…

MoE架構訓練系統設計:專家并行與門控網絡優化策略

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 混合專家&#xff08;Mixture of Experts&#xf…

使用Python爬蟲,selenium和requests誰更強?

py爬蟲的話&#xff0c;selenium和reqeusts誰更強&#xff0c;selenium是不是能完全取代requests? 答案基本是可以的&#xff0c;selenium適合動態網頁抓取&#xff0c;因為它可以控制瀏覽器去點擊、加載網頁&#xff0c;requests則比較適合靜態網頁采集&#xff0c;它非常輕…

編譯原理-文法壓縮練習

這個任務的目標就是把一個給定的文法變得“干凈”和“高效”&#xff0c;剔除所有無用的部分。根據幻燈片&#xff0c;無用的&#xff08;多余的&#xff09;規則分為兩大類&#xff1a; 不可達規則&#xff1a;規則的“頭”&#xff08;左部非終結符&#xff09;從起始符號出發…

GPU硬件架構和配置的理解

從公司架構理解GPU架構想象一個GPU就像一家大型科技公司&#xff0c;它的任務是處理圖形和計算任務&#xff08;“干活”&#xff09;。硬件概念公司架構比喻作用和特點Platform (平臺)集團公司最大的獨立實體。比如谷歌Alphabet是一個集團公司&#xff0c;它旗下有谷歌、Waymo…

【硬件開發】電源抑制比PSRR

電源抑制比PSRR是電壓輸入量和電壓輸出量的比值&#xff0c;通常用dB來表示。 PSRR這個參數經常和運放&#xff0c;LDO,DCDC變換器有關聯。(2 封私信 / 58 條消息) 電源抑制比(PSRR)的基礎知識 - 知乎

七、卷積神經網絡

目錄 7.1 整體結構 7.2 卷積層 7.2.1 全連接層存在的問題 7.2.2 卷積運算 7.2.3 填充 7.2.5 3維數據的卷積運算 7.2.6 結合方塊思考 7.2.7 批處理 7.3 池化層 7.4 卷積層和池化層的實現 7.4.1 4維數組 7.4.2 基于 im2col的展開 7.4.3 卷積層的實現 7.4.4 池化層的…

加餐加餐!燒烤斗破蒼穹

忽然起了吃燒烤的念頭&#xff0c;便掏出手機點了一堆。不過二十分鐘&#xff0c;外賣小哥便按響了門鈴&#xff0c;手里提著一個方正的紙袋&#xff0c;還冒著熱氣。我將燒烤一一取出&#xff0c;排在茶幾上。肉串油光發亮&#xff0c;韭菜翠綠間點綴著蒜蓉&#xff0c;茄子剖…

搜索引擎收錄網站帶www和不帶www有區別嗎?

這是一個非常常見且重要的問題。簡單直接的回答是&#xff1a;有區別&#xff0c;但對搜索引擎來說&#xff0c;處理得當就不會重復&#xff1b;處理不當則會造成嚴重重復和權重分散。下面我為您詳細解釋一下&#xff0c;并提供正確的處理方法。核心區別&#xff1a;兩個不同的…

AFSim2.9.0學習筆記 —— 2、AFSim的Wizard軟件概述(ArkSIM集成開發環境 (IDE))

&#x1f514; AFSim2.9.0 相關技術、疑難雜癥文章合集&#xff08;掌握后可自封大俠 ?_?&#xff09;&#xff08;記得收藏&#xff0c;持續更新中…&#xff09; 若還沒有下載AFSim2.9.0完整軟件或源碼&#xff0c;請先進入本人另篇文章了解下載。 正文 ??主界面 打開 Ar…

建自己的Python項目倉庫,使用工具:GitHub(遠程倉庫)、GitHub Desktop(版本控制工具)、VSCode(代碼編輯器)

結合 GitHub&#xff08;遠程倉庫&#xff09;、GitHub Desktop&#xff08;版本控制工具&#xff09;、VSCode&#xff08;代碼編輯器&#xff09; 三個工具&#xff0c;以下是更具體的Python項目倉庫搭建流程&#xff0c;包含工具協同操作的詳細步驟&#xff1a; 一、整體流程…