資料結構 2雙鏈表

2021-10-03 09:20:00 字數 1992 閱讀 2097

實現簡單的雙鏈表

結構體node:前結點pre、後結點next、資料data

類dlist:頭結點head、尾結點last、長度len

主要功能有:新增(前插入、後插入、一般位置插入)、刪除(前推出、後推出、值刪除、位置刪除)、查詢(值查詢、位置查詢)、鍊錶複製、列印、返回鍊錶長度

時間複雜度:

1、新增

前插入:因為存在頭結點head,時間複雜度為o(1)

後插入:因為存在尾結點last,時間複雜度為o(1)

一般位置插入:需要遍歷鍊錶,時間複雜度為o(n)

2、刪除

前推出:因為存在頭結點head,時間複雜度為o(1)

後推出:因為存在尾結點last,並且存在前結點指標pre,因此時間複雜度為o(1)

值刪除:需要遍歷鍊錶,時間複雜度為o(n)

位置刪除:需要遍歷鍊錶,時間複雜度為o(n)

3、查詢

值查詢:需要遍歷鍊錶,時間複雜度為o(n)

位置查詢:需要遍歷鍊錶,時間複雜度為o(n)

4、鍊錶複製

需要遍歷鍊錶,時間複雜度為o(n)

總結:雙鏈表的效率體現在前插入、前推出、後插入和後推出,其他操作時間複雜度都是o(n)

(ps:對於更簡單的雙鏈表,即只維護頭結點head,只有前插入和前推出有效率)

#include

using

namespace std;

template

<

typename t >

struct node };

//雙鏈表

template

<

typename t >

class

dlist

~dlist()

//新增:後插入、前插入、一般位置插入

//後插入

void

push_back

(t val)

//前插入

void

push_front

(t val)

//一般插入

void

insert

(t val,

int pos)

len++;}

//刪除:前推出、後推出、值刪除、位置刪除

//前推出

t pop_front()

//後推出

t pop_back()

//值刪除

void

del_val

(t val)

else

if(p == last)

else}}

len--;}

//位置刪除

t del_pos

(int pos)

//查詢:值查詢、位置查詢

//值查詢

intfind_val

(t val)

return-1

;//返回最後一次出現的位置

/* node* p = last;

for (int pos = 1; p != nullptr; pos++)

return -1;

*///返回數量

/* node* p = head;

int n=0;

for (; p != nullptr;p = p->next)

if(n==0)

return -1;

return n;

*/}//位置查詢

t find_pos

(int pos)

//鍊錶複製

dlist copy()

return list;

}//列印

void

print()

cout << endl;

}//返回鍊錶長度

intsize()

};intmain()

附上測試用例

如有不對,請大佬指出orz

資料結構 雙鏈表

typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...

資料結構 雙鏈表

目標 掌握雙鏈表的資料結構 來看看什麼是雙鏈表吧 雙鏈表與單鏈表的區別,單鏈表是單項的 而雙鏈表是有左右的 題目acwing 827 實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k...

資料結構 雙鏈表

單鏈表結點中只有乙個只指向後繼的指標,使得單鏈表只能從頭結點開始一次順序的先後遍歷。要訪問某個結點的前驅結點 插入刪除操作時 只能從頭開始遍歷,訪問後繼節點的時間複雜度為o 1 訪問前驅結點的時間複雜度為o n 為了克服單鏈表的上述缺點,引入了雙鏈表,雙鏈表結點中有兩個指標prior 和 next,...