演算法(雙鏈表)

2021-10-23 14:04:21 字數 1702 閱讀 8014

實現乙個雙鏈表,雙鏈表初始為空,支援5種操作:

(1) 在最左側插入乙個數;

(2) 在最右側插入乙個數;

(3) 將第k個插入的數刪除;

(4) 在第k個插入的數左側插入乙個數;

(5) 在第k個插入的數右側插入乙個數

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

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

輸入格式

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

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

(1) 「l x」,表示在鍊錶的最左端插入數x。

(2) 「r x」,表示在鍊錶的最右端插入數x。

(3) 「d k」,表示將第k個插入的數刪除。

(4) 「il k x」,表示在第k個插入的數左側插入乙個數。

(5) 「ir k x」,表示在第k個插入的數右側插入乙個數。

輸出格式

共一行,將整個鍊錶從左到右輸出。

資料範圍

1≤m≤100000

所有操作保證合法。

輸入樣例:

10

r 7d 1

l 3il 2 10

d 3il 2 7

l 8r 9

il 4 7

ir 2 2

輸出樣例:

8 7 7 3 2 9
#include

#include

using

namespace std;

const

int n=

1e6+10;

int e[n]

,l[n]

,r[n]

,idx;

//初始化

void

init()

void

remove

(int k)

void

add(

int k,

int x)

intmain()

else

if(op==

"r")

else

if(op==

"d")

else

if(op==

"il"

)else

if(op==

"ir")}

for(

int i=r[0]

;i!=

1;i=r[i]

) cout<

<<

" ";

cout<

return0;

}

部分詳解

插入

刪除

雙鏈表演算法

package main import fmt type node struct 末尾插入 func insert head node,newnode node tmp tmp.next 正向遍歷 func list head node forelse tmp tmp.next 反向遍歷 func ...

迴圈雙鏈表演算法

設乙個帶頭結點的迴圈雙鏈表 dl,結點的值可能重複。設 計乙個演算法輸出 dl 所有元素的值,引數 d 0 時按照前驅方向輸出,d 1 時按照 後繼方向輸出。記得那次作業裡有乙個寫的很麻煩沒啥意思好像就是這個 建立乙個迴圈單鏈表,然後設乙個輸出函式 include include include d...

雙鏈表的演算法操作

1 雙鏈表 雙鏈表就是在單鏈表結點上增添了乙個指標域,指向當前結點的前驅。2 雙鏈表結點定義 typedef struct doublelinkedlists doublelinkedlists 3 插入結點的演算法 假設在雙鏈表中p所指的結點之後插入乙個結點s,操作如下 1 s next p ne...