通過陣列模擬實現單鏈表

2021-10-21 22:57:13 字數 1742 閱讀 3197

一般情況下,在c或c++裡面實現單鏈表需要使用結構體,這是一種動態鍊錶,這種鍊錶基本可以不受空間的限制,動態的分配記憶體,但是在c++中使用new運算子來申請空間速度很慢,在一般的演算法題目中,可以採用陣列來模擬鍊錶,這是一種靜態鍊錶。這種模擬確實存在一定的空間浪費,但是我們只是為了解決演算法題目,有一定的浪費不用太計較,另外還要注意一點,就是我們要使用兩個陣列,乙個存插入順序(即第幾個插入的),乙個存插入值,特別要注意它第乙個插入的下標為零,但是在最後頭指標head不一定指向0,因為這是一種靜態鍊錶,一旦插入,那麼他的下標不會改變,在某個結點的前後插入或刪除都不會影響當前結點的下標,比如剛開始頭結點指向0,但是第n次操作,我要在頭結點後面插入乙個數,那麼插入的數下標應該是n-1,此時在該單鏈表的角度來看下標大的排在了前面,但是在陣列的層面來看下標大的還是在後面(這是很重要的一點,一定要想明白)。

接下來看一道來自acwing的題:

實現乙個單鏈表,鍊錶初始為空,支援三種操作:

(1) 向煉表頭插入乙個數;

(2) 刪除第k個插入的數後面的數;

(3) 在第k個插入的數後插入乙個數

現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。

注意:題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的時間順序,這n個數依次為:第1個插入的數,第2個插入的數,…第n個插入的數。

輸入格式

第一行包含整數m,表示操作次數。

接下來m行,每行包含乙個操作命令,操作命令可能為以下幾種:

(1) 「h x」,表示向煉表頭插入乙個數x。

(2) 「d k」,表示刪除第k個插入的數後面的數(當k為0時,表示刪除頭結點)。

(3) 「i k x」,表示在第k個插入的數後面插入乙個數x(此操作中k均大於0)。

輸出格式

共一行,將整個鍊錶從頭到尾輸出。

資料範圍

1≤m≤100000

所有操作保證合法。

輸入樣例:

10h 9

i 1 1

d 1d 0

h 6i 3 6

i 4 5

i 4 5

i 3 4

d 6輸出樣例:

6 4 6 5

這道題就採用了陣列模擬單鏈表

具體思想和前面的分析類似,接下來看一下**

#include

using

namespace std;

const

int n =

100010

;int val[n]

, ne[n]

;int head, idx;

void

init()

void

add_to_head

(int x)

void

removek

(int k)

void

insert

(int k,

int x)

intmain()

else

if(op ==

'd')

else

}for

(int i = head; i !=-1

; i = ne[i]

) cout << val[i]

<<

' ';

//使用i=ne[i]使得i可以向後移動

cout << endl;

return0;

}

c 模擬實現單鏈表

思路 單鏈表屬於線性表中的連式結構,邏輯上數連續的,但是物理儲存上是不連續的,宣告鍊錶節點結構,然後就是指標的運用,test.h define crt secure no warnings 1 include include using namespace std typedef int sltda...

棧Stack(陣列模擬 單鏈表模擬)

入棧 出棧 應用場景 3 表示式的轉換 中綴表示式 字尾表示式 與求值 實際解決 4 二叉樹的遍歷。5 圖形的深度優先搜尋法。案例 1.用陣列模擬棧的使用 思路分析 定義乙個變數指標top,初始化top 1,始終指向棧頂元素。入棧操作push 當有資料加入到棧時,top stack top 出棧操作...

記通過資料模擬裝置的實現邏輯

專案背景 現專案主要是做關於機械人的排程系統,涉及到web端 移動端 小程式及服務端和實體機械人端 問題而相互推諉 為避免相互推諉,決定實現乙個資料模擬器 記錄方向 資料模擬器 因為開發環境沒有資料可用,最最開始的方案是將測試環境的資料橋接到開發環境的 機械人與服務端的通訊是通過mqtt協議的,橋接...