實現簡單的雙鏈表
結構體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,...