更新時(shí)間:2022-09-01 10:26:32 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1210次
從鏈表中刪除給定節(jié)點(diǎn)。
鏈表:102030無效的
輸入
20
輸出
1030無效的
輸入
30
輸出
1020無效的
1.如果頭節(jié)點(diǎn)有給定的key,
使頭節(jié)點(diǎn)指向第二個(gè)節(jié)點(diǎn)并釋放其內(nèi)存。
2. 否則,
從當(dāng)前節(jié)點(diǎn),檢查下一個(gè)節(jié)點(diǎn)是否有給定的key
如果是,則使 current->next = current->next->next 并釋放內(nèi)存。
否則,將當(dāng)前節(jié)點(diǎn)更新為下一個(gè)節(jié)點(diǎn)并執(zhí)行上述過程(從步驟 2 開始)直到最后一個(gè)節(jié)點(diǎn)。
void deleteNode ( struct node ** head, int key)
{
//temp用于釋放內(nèi)存
struct node * temp;
//在頭節(jié)點(diǎn)上找到的鍵。
//移動(dòng)到頭節(jié)點(diǎn)到下一個(gè)并釋放頭。
if ( * head -> data == key)
{
溫度= *頭; //備份head以釋放內(nèi)存
* head = ( * head) -> next;
免費(fèi)(臨時(shí));
}
}
視覺表現(xiàn)
讓我們刪除數(shù)據(jù) 10(頭節(jié)點(diǎn))。
對(duì)于其他節(jié)點(diǎn)(Non-Head)
void deleteNode ( struct node ** head, int key)
{
//temp用于釋放內(nèi)存
struct node * temp;
//在頭節(jié)點(diǎn)上找到的鍵。
//移動(dòng)到頭節(jié)點(diǎn)到下一個(gè)并釋放頭。
如果((*頭)->數(shù)據(jù)==鍵)
{
溫度= *頭; //備份釋放內(nèi)存
* head = ( * head) -> next;
免費(fèi)(臨時(shí));
}
別的
{
結(jié)構(gòu)節(jié)點(diǎn)*當(dāng)前 = *頭;
而(當(dāng)前->下一個(gè)!= NULL)
{
//如果是,我們需要?jiǎng)h除當(dāng)前->下一個(gè)節(jié)點(diǎn)
if (current -> next -> data == key)
{
臨時(shí)=當(dāng)前->下一個(gè);
//節(jié)點(diǎn)將與鏈表斷開連接。
當(dāng)前->下一個(gè)=當(dāng)前->下一個(gè)->下一個(gè);
免費(fèi)(臨時(shí));
休息;
}
//否則,移動(dòng)當(dāng)前節(jié)點(diǎn)并繼續(xù)
else
current = current -> next;
}
}
}
視覺表現(xiàn)
讓我們刪除數(shù)據(jù) 20
例子
#include<stdio.h>
#include<stdlib.h>
結(jié)構(gòu)節(jié)點(diǎn)
{
整數(shù)數(shù)據(jù);
結(jié)構(gòu)節(jié)點(diǎn)*下一個(gè);
};
void addLast ( struct node ** head, int val)
{
//創(chuàng)建一個(gè)新節(jié)點(diǎn)
struct node * newNode = malloc( sizeof ( struct node));
新節(jié)點(diǎn)->數(shù)據(jù)= val;
新節(jié)點(diǎn)->下一個(gè) = NULL ;
//如果head為NULL,它是一個(gè)空列表
if ( * head == NULL )
* head = newNode;
//否則,找到最后一個(gè)節(jié)點(diǎn),添加newNode
else
{
結(jié)構(gòu)節(jié)點(diǎn)* lastNode = *頭;
//最后一個(gè)節(jié)點(diǎn)的下一個(gè)地址將為NULL。
while (lastNode -> next != NULL )
{
最后一個(gè)節(jié)點(diǎn)=最后一個(gè)節(jié)點(diǎn)->下一個(gè);
}
//在鏈表末尾添加newNode
lastNode -> next = newNode;
}
}
void deleteNode ( struct node ** head, int key)
{
//temp用于釋放內(nèi)存
struct node * temp;
//在頭節(jié)點(diǎn)上找到的鍵。
//移動(dòng)到頭節(jié)點(diǎn)到下一個(gè)并釋放頭。
如果((*頭)->數(shù)據(jù)==鍵)
{
溫度= *頭; //備份釋放內(nèi)存
* head = ( * head) -> next;
免費(fèi)(臨時(shí));
}
別的
{
結(jié)構(gòu)節(jié)點(diǎn)*當(dāng)前 = *頭;
而(當(dāng)前->下一個(gè)!= NULL)
{
//如果是,我們需要?jiǎng)h除當(dāng)前->下一個(gè)節(jié)點(diǎn)
if (current -> next -> data == key)
{
臨時(shí)=當(dāng)前->下一個(gè);
//節(jié)點(diǎn)將與鏈表斷開連接。
當(dāng)前->下一個(gè)=當(dāng)前->下一個(gè)->下一個(gè);
免費(fèi)(臨時(shí));
休息;
}
//否則,移動(dòng)當(dāng)前節(jié)點(diǎn)并繼續(xù)
else
current = current -> next;
}
}
}
無效 打印列表(結(jié)構(gòu)節(jié)點(diǎn)*頭)
{
結(jié)構(gòu)節(jié)點(diǎn)*溫度=頭;
//迭代整個(gè)鏈表并打印數(shù)據(jù)
while (temp != NULL )
{
printf( "%d ->" , temp -> data);
溫度=溫度->下一個(gè);
}
printf( "NULL \n " );
}
主函數(shù) ()
{
結(jié)構(gòu)節(jié)點(diǎn)*頭= NULL ;
addLast( &頭, 10 );
addLast( &頭, 20 );
addLast( &頭, 30 );
printf( "鏈表元素:\n " );
打印列表(頭);
//刪除第一個(gè)節(jié)點(diǎn)
deleteNode( & head, 10 );
printf( "刪除10.新鏈表:\n " );
打印列表(頭);
//刪除最后一個(gè)節(jié)點(diǎn)
deleteNode( & head, 30 );
printf( "刪除 30. 新鏈表:\n " );
打印列表(頭);
//刪除 20
deleteNode( & head, 20 );
printf( "已刪除 20. 新鏈表:\n " );
打印列表(頭);
返回 0 ;
}
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)