c语言链表有没有哨兵的区别,链表中的哨兵(sentinel)
哨兵節(jié)點(diǎn)廣泛應(yīng)用于樹(shù)和鏈表中,如偽頭、偽尾、標(biāo)記等,它們是純功能的,通常不保存任何數(shù)據(jù),其主要目的是使鏈表標(biāo)準(zhǔn)化,如使鏈表永不為空、永不無(wú)頭、簡(jiǎn)化插入和刪除。
問(wèn)題:刪除鏈表中等于給定值val的所有節(jié)點(diǎn)。
1,如果節(jié)點(diǎn)在中間,只需將該節(jié)點(diǎn)進(jìn)行刪除即可。
2,如果節(jié)點(diǎn)在頭部,則問(wèn)題將有點(diǎn)復(fù)雜,不能直接將頭節(jié)點(diǎn)刪掉,這樣會(huì)造成鏈表的丟失。通過(guò)設(shè)置哨兵節(jié)點(diǎn),用來(lái)臨時(shí)保存頭部節(jié)點(diǎn),最后在計(jì)算完畢以后,返回該節(jié)點(diǎn)。
代碼如下:/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
if (head == NULL)
return NULL;
struct ListNode *ret = (struct ListNode*)malloc(sizeof(struct ListNode));
ret->next = head;
struct ListNode *pre = ret;
struct ListNode *cur = head;
while (cur != NULL)
{
if (cur->val == val)
{
pre->next = cur->next;
cur = cur->next;
}
else
{
cur = cur->next;
pre = pre->next;
}
}
return ret->next;
}
使用兩個(gè)指針,一個(gè)表示前一個(gè)節(jié)點(diǎn),一個(gè)表示當(dāng)前節(jié)點(diǎn)。
當(dāng)當(dāng)前節(jié)點(diǎn)需要?jiǎng)h除時(shí),
pre->next = cur->next;
哨兵節(jié)點(diǎn)用來(lái)保存頭結(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),返回是,返回->next即可。
malloc申請(qǐng)的內(nèi)存由調(diào)用者釋放。
總結(jié)
以上是生活随笔為你收集整理的c语言链表有没有哨兵的区别,链表中的哨兵(sentinel)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 紫檀木多少钱啊?
- 下一篇: android服务下载,android服