鏈表作為基礎數據結構,根據指針方向與連接方式主要分為三類:
節點僅包含指向後繼節點的指針。插入操作常見兩種模式:頭插法僅需維護頭節點,適合模擬棧(LIFO)結構;尾插法需同時維護頭尾指針,天然適合模擬隊列(FIFO)結構。
每個節點擁有前驅與後繼兩個指針,支持雙向遍歷。此特性使其成為瀏覽器歷史記錄、音樂播放列表等需要前後導航場景的首選結構。
尾節點指向頭節點形成閉環,常見於面試題中的環檢測問題,也是實現循環隊列、多任務輪詢調度的基礎結構。
維護 current(當前節點)與 previous(前驅節點)指針。遍歷至目標節點時,執行 previous->next = current->next 並釋放 current。需特別處理刪除頭節點的邊界情況。
使用 Node** current 間接引用節點指針,配合臨時變量 entry。刪除時直接執行 *current = entry->next 並釋放 entry。此法巧妙統一了頭節點與普通節點的刪除邏輯,代碼更簡潔健壯。
傳統鏈表頻繁調用系統分配/釋放內存(malloc/free 或 new/delete),存在三大弊端:
解決方案:預先構建內存池,插入時從池中取節點,刪除時歸還節點。優勢在於:零系統調用開銷、無內存碎片、節點連續分布提升緩存命中率。
維護 prev、curr、next 三指針,遍歷過程中逐個反轉指針方向,時間 O(n),空間 O(1)。
將第 3 至 N 個節點依次頭插到頭節點之後,最後將原頭節點移至新表尾部。本質同上但思維角度不同。
遞歸處理 head->next 之後的子鏈表,回溯時修改 head 與 head->next 的指向。代碼極簡但需注意棧溢出風險。
stack),再依次出棧打印,顯式控制內存更安全。快指針每步 2 格,慢指針每步 1 格,相遇即有環。
記錄相遇點,一指針原地,另一指針繼續繞環,再次相遇時慢指針走過步數即環長。
數學證明:相遇點到入口距離 = 頭節點到入口距離。雙指針分別從頭節點與相遇點出發,同速前進,相遇點即入口。
非環部分長度 + 環長度(問題 2 + 問題 3)。
使用指針數組(一維)追蹤元素,元素本身可離散分佈。優勢:
典型應用:內存池管理(指針指向各塊內存首址)、散列鏈表(指針指向含 next 域的節點)。
用數組下標模擬指針,節點包含 data 與 link(下標)。核心應用:並查集。
兩者結合使時間復雜度趨近 O(α(n)),極其高效。