刪除結點
遍歷元素
雙鏈表的高階操作
與單鏈表一樣,我還是建議用過掌握基礎操作來拼湊成大的操作。
單鏈表指標域只有乙個next
指標,指向下乙個結點,這就導致了它只能從前往後訪問。為了彌補這一缺陷,我們可以往指標域裡再加入乙個指標prior
,用於指向前面的結點,這樣就可以實現雙向訪問了:
與單鏈表相似,建立雙鏈表其實就是建立頭指標,我們還是將初始化寫在下面這個initlist
函式裡:
void
initlist
(node *
&head)
在此基礎上,我們要定義乙個雙鏈表只需要:
node *head;
initlist
(head)
;
在某個結點後插入元素
雖然雙鏈表的prior
指標使得逆向操作成為可能,但習慣期間,還是經常在某個節點之後插入新的結點,比如我要在p
結點之後插入q
結點,插入過程是這樣的:
)//判斷p是不是尾結點
p->next-
>prior=q;
//2q-
>prior=p;
//3p-
>next=q;
//4在某個結點前插入元素
畢竟是雙鏈表,思來想去還是決定把這個也寫一下。在結點nxt
之前插入p
結點:
記憶方法
發現規律沒有?無論是往前插入結點,還是往後插入結點,都是只能用到待插入結點q
和兩個結點中的乙個p
,因此,我們稱另乙個沒被用到的結點為打醬油的結點
(一本正經)
無論是哪種插法,打醬油的結點
總是最先被針對。因此我們只要再記住,每次q
與p
或q
與醬油結點
連線的過程中,都是q
先動的手,就能順利地記住連線順序。
在頭部插入元素s
s-
>next=head-
>next;
if(head-
>next!=
null
) head-
>next-
>prior=s;
s->prior=head;
head-
>next=s;
在尾部插入元素ss-
>data=a[i]
;tail-
>next=s;
s->prior=tc;
tail=s;
刪除結點p
的時候,我們可以將p
前面的結點用p->prior
表示,p
後面的結點用p->next
表示,也就是說**裡可以只有p
![](https://pic.w3help.cc/845/01b69f367fd6d6dd38226e661e521.jpeg)
if
(p->prior!=
null
)//判斷p是不是第乙個
p->prior-
>next=p-
>next;
//1if
(p->next!=
null
)//判斷p是不是最後乙個
p->next-
>prior=p-
>prior;
//2delete p;
ps.這裡的1和2可以換順序
與單鏈表幾乎沒啥區別
void
findbro
(node *head)
}
求長度int
getlength
(node *head)
return count;
}
基本都和單鏈表一樣,只是在基本操作上有細微差別。只要把基本操作一換,大框架保持原樣就好啦
void
output
(node *head)
cout<
}
void
deleelem
(node *
&head,
int i)
void
createlist_head
(node *
&head,
int a,
int len)
}
void
createlist_tail
(node *
&head,
int a,
int len)
tc->next=
null
;}
void
deleelem
(node *
&head,
int i)
void
inselem
(node *
&head,
int value,
int i)
資料結構 雙鏈表
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,...