更新時間:2022-09-01 10:26:32 來源:動力節(jié)點 瀏覽1253次
從鏈表中刪除給定節(jié)點。
鏈表:102030無效的
輸入
20
輸出
1030無效的
輸入
30
輸出
1020無效的
1.如果頭節(jié)點有給定的key,
使頭節(jié)點指向第二個節(jié)點并釋放其內(nèi)存。
2. 否則,
從當前節(jié)點,檢查下一個節(jié)點是否有給定的key
如果是,則使 current->next = current->next->next 并釋放內(nèi)存。
否則,將當前節(jié)點更新為下一個節(jié)點并執(zhí)行上述過程(從步驟 2 開始)直到最后一個節(jié)點。
void deleteNode ( struct node ** head, int key)
{
//temp用于釋放內(nèi)存
struct node * temp;
//在頭節(jié)點上找到的鍵。
//移動到頭節(jié)點到下一個并釋放頭。
if ( * head -> data == key)
{
溫度= *頭; //備份head以釋放內(nèi)存
* head = ( * head) -> next;
免費(臨時);
}
}
視覺表現(xiàn)
讓我們刪除數(shù)據(jù) 10(頭節(jié)點)。
對于其他節(jié)點(Non-Head)
void deleteNode ( struct node ** head, int key)
{
//temp用于釋放內(nèi)存
struct node * temp;
//在頭節(jié)點上找到的鍵。
//移動到頭節(jié)點到下一個并釋放頭。
如果((*頭)->數(shù)據(jù)==鍵)
{
溫度= *頭; //備份釋放內(nèi)存
* head = ( * head) -> next;
免費(臨時);
}
別的
{
結(jié)構(gòu)節(jié)點*當前 = *頭;
而(當前->下一個!= NULL)
{
//如果是,我們需要刪除當前->下一個節(jié)點
if (current -> next -> data == key)
{
臨時=當前->下一個;
//節(jié)點將與鏈表斷開連接。
當前->下一個=當前->下一個->下一個;
免費(臨時);
休息;
}
//否則,移動當前節(jié)點并繼續(xù)
else
current = current -> next;
}
}
}
視覺表現(xiàn)
讓我們刪除數(shù)據(jù) 20
例子
#include<stdio.h>
#include<stdlib.h>
結(jié)構(gòu)節(jié)點
{
整數(shù)數(shù)據(jù);
結(jié)構(gòu)節(jié)點*下一個;
};
void addLast ( struct node ** head, int val)
{
//創(chuàng)建一個新節(jié)點
struct node * newNode = malloc( sizeof ( struct node));
新節(jié)點->數(shù)據(jù)= val;
新節(jié)點->下一個 = NULL ;
//如果head為NULL,它是一個空列表
if ( * head == NULL )
* head = newNode;
//否則,找到最后一個節(jié)點,添加newNode
else
{
結(jié)構(gòu)節(jié)點* lastNode = *頭;
//最后一個節(jié)點的下一個地址將為NULL。
while (lastNode -> next != NULL )
{
最后一個節(jié)點=最后一個節(jié)點->下一個;
}
//在鏈表末尾添加newNode
lastNode -> next = newNode;
}
}
void deleteNode ( struct node ** head, int key)
{
//temp用于釋放內(nèi)存
struct node * temp;
//在頭節(jié)點上找到的鍵。
//移動到頭節(jié)點到下一個并釋放頭。
如果((*頭)->數(shù)據(jù)==鍵)
{
溫度= *頭; //備份釋放內(nèi)存
* head = ( * head) -> next;
免費(臨時);
}
別的
{
結(jié)構(gòu)節(jié)點*當前 = *頭;
而(當前->下一個!= NULL)
{
//如果是,我們需要刪除當前->下一個節(jié)點
if (current -> next -> data == key)
{
臨時=當前->下一個;
//節(jié)點將與鏈表斷開連接。
當前->下一個=當前->下一個->下一個;
免費(臨時);
休息;
}
//否則,移動當前節(jié)點并繼續(xù)
else
current = current -> next;
}
}
}
無效 打印列表(結(jié)構(gòu)節(jié)點*頭)
{
結(jié)構(gòu)節(jié)點*溫度=頭;
//迭代整個鏈表并打印數(shù)據(jù)
while (temp != NULL )
{
printf( "%d ->" , temp -> data);
溫度=溫度->下一個;
}
printf( "NULL \n " );
}
主函數(shù) ()
{
結(jié)構(gòu)節(jié)點*頭= NULL ;
addLast( &頭, 10 );
addLast( &頭, 20 );
addLast( &頭, 30 );
printf( "鏈表元素:\n " );
打印列表(頭);
//刪除第一個節(jié)點
deleteNode( & head, 10 );
printf( "刪除10.新鏈表:\n " );
打印列表(頭);
//刪除最后一個節(jié)點
deleteNode( & head, 30 );
printf( "刪除 30. 新鏈表:\n " );
打印列表(頭);
//刪除 20
deleteNode( & head, 20 );
printf( "已刪除 20. 新鏈表:\n " );
打印列表(頭);
返回 0 ;
}