[ C語言生活記事 ] 資料結構 linked list 實作 (3)

本系列文章 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;               //因為頭指標可能會變,回傳頭指標
}