鍊錶結點的刪除

2021-09-01 09:22:19 字數 2403 閱讀 7619

鍊錶結點的刪除

結點的刪除分為兩種情況:

(1)刪除頭結點。(需要改變頭指標位置)

(2)刪除中間,尾結點。(帶刪除結點的前驅必須有指標,將帶刪除結點的前驅與帶刪除結點的後繼連起來)

例題1

設head指向乙個非空單項鍊表,且資料域的值不重複,在鍊錶中刪除關鍵字值為key的結點。

分析

第一步:查詢值為key的結點(分為能找到和不能找到兩種情況)

方法:for(p=h;p&&p->datakey;q=p,p=p->next);

解釋:運用空迴圈,在p指向不為空且p指向的值不為key是迴圈繼續,反之則跳出迴圈。

第二步:刪除該結點

//如果p指向為null,則p遍歷鍊錶,未找到key值

if(pnull)

printf(「未找到。\n」);

//如果p指向不為null,則找到了key值

else

具體**:

#include #include#include#define n 10

typedef struct node

elensn;

//鍊錶的建立

elensn *initlink(int *a,int n)

return h;

}//輸出鍊錶

void printlink(elensn* head)

//核心**,查詢並刪除key

elensn* delsinglenode(elensn* h,int key)

return(h);

}int main()

,key;

elensn * head;

head=initlink(a,n);

printf("請輸出要刪除的內容key\n");

scanf("%d",&key);

head=delsinglenode(head,key);

printlink(head);

return 0;

}

實現效果

(1)當找到要刪除值key值時:

(2)當未找到要刪除值key時:

例題2

設head指向乙個非空單項鍊表,並且資料域的值不重複,刪除鍊錶中的最大值結點

方法一:

#include #include#include#define n 10

//資料結構

typedef struct node

elensn;

//建立鍊錶

elensn *initlink(int *a,int n)

return h;

}//鍊錶的輸出

void printlink(elensn* head)

//核心**,刪除最大值結點

elensn* delmax(elensn* head)

int main()

; elensn * head;

head=initlink(a,n);

head=delmax(head);

printlink(head);

return 0;

}

方法二

相較於第一種方法,第二種方法更為簡便,不用再次遍歷鍊錶找到pmax的前驅指標,而是在找到pamx指標的同時,尋找它的錢去指標qmax。

核心**:

elensn* delmax(elensn* head)

if(pmax==head)

head=head->next;

else

qmax->next=pmax->next;

free(pmax);

pmax=null;

return(head);

}實現效果

當資料域中的值為15,1,2,3,4,5,6,8,9,7時,所要刪除的最大值為頭結點,輸出結果為:

當資料域為1,2,3,4,5,6,8,9,7,15時,所要刪除的結點為中加,尾結點時,輸出結果為:

刪除鍊錶結點

劍指offer18題 刪除鍊錶的節點 題目描述 給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。返回刪除後的鍊錶的頭節點。解題思路 該題在劍指offer中的原題是,給定乙個單鏈表的頭指標 指定結點指標,要求以o 1 的時間複雜度刪除該結點。解決方法為將待刪除結點的後繼結點的值 賦...

刪除鍊錶的結點

1.問題描述 給定鍊錶的頭結點和待刪除結點,要求刪除鍊錶的結點要求時間複雜度為o 1 來自 劍指offer 2.分析 我們都知道鍊錶的要想訪問某個結點必須要從頭結點挨個遍歷,並且單鏈表我們沒有指向前驅的結點,因此我們可以用狸貓換太子 用這個待刪除結點的下個結點裡面的內容,複製到這個待刪除結點,然後刪...

刪除鍊錶的結點

刪除鍊錶的結點 請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾的 節點,您將只被給予要求被刪除的節點。比如 假設該鍊錶為1 2 3 4,給定您的為該鍊錶中值為3的第三個節點,那麼在呼叫了您的函式之後,該鍊錶則應變成1 2 4。這道題讓我們刪除鍊錶的乙個節點,更通常不同的是,沒有給我們鍊錶的起點...