本系列文章 part1 ~ part3 實作 Linked list 的幾個function
(1) NODE型態的定義
(2) GetNode
(3) FreeNode
(4) FindNode
(5) InsertNode
(6) DeleteNode
(7) ReverseList
(6) DeleteNode
刪除節點可以分三個部份來討論,
1. 刪除頭節點
2. 刪除尾巴
3. 刪除中間
NODE* DeleteNode(NODE* pHead, NODE* ptr)
{
NODE* PreNode = pHead; //宣告一個pre指標指向欲刪除節點的前一節點
if( ptr == pHead ) //刪除頭指標
{
pHead = pHead->next;
}
else
{
while(PreNode->next != ptr) //將PreNode移動至ptr的前一個節點
PreNode = PreNode->next;
if( ptr->next = NULL ) //刪除尾巴節點,將PreNode的下個節點設為NULL
PreNode->next = NULL;
else //刪除中間節點
PreNode->next = ptr->next;
}
FreeNode(ptr);
return pHead; //因為頭指標可能會變,回傳頭指標
}
(7) ReverseNode
反轉linked list,採用三個指標實作
NODE* ReverseNode(NODE* pHead)
{
NODE* CurNode = pHead; //宣告一個Current指標指向欲反轉節點
NODE* PreNode = NULL; //宣告一個Previous指標指向欲反轉節點的前一節點
while(PreNode->next != NULL)
{
pHead = CurNode->next; //採用Head, Cur, Pre三個指標做移動並反轉串列
CurNode->next = PreNode;
PreNode = CurNode;
CurNode = pHead;
}
pHead->next = PreNode; //當pHead移動到最後一個節點時,會離開while迴圈,因此最後一次要額外處理
return pHead; //因為頭指標可能會變,回傳頭指標
}