Reverse LinkList

1492 ワード

に質問
反転単一チェーンテーブル例:元のチェーンテーブル:1->2->3->4現地で反転、反転後:4->3->2->1
主な考え方
2つのポインタが必要です.1つはcurrentNodeを指し、1つはprevNodeを指します.各操作はcurrentNodeのnextを前のノードに指し,操作前にcurrentNodeのnext位置を記録することに注意する.
初期化:currentNodeはチェーンテーブルの先頭要素を指し、prevNodeは空です.循環体:
  • currentNodeのpNextをtempで保存します.
  • 主な操作:currentNodeのnextをprevNodeに向けます.
  • prevNodeとcurrentNodeを更新します.

  • コードは次のとおりです.
    void ReverseList(LinkList** pList){
        if (*pList == NULL) {
            return;
        }
    
        Node* pCurrent = *pList;
        Node* pPrev = NULL;
        while(pCurrent){
            Node *pNext = pCurrent->pNext;
            pCurrent->pNext = pPrev;
            pPrev = pCurrent;
            pCurrent = pNext;
        }
        if (pPrev) {
            *pList = pPrev;  
        }
    }
    

    まちがったところ
    1、単一チェーンテーブルノード定義コンパイルレポートwarningは以下の通りである.
    algorithm/list.c:19:15: warning: incompatible pointer types initializing 'Node *' with an expression of type 'struct Node *' [-Wincompatible-pointer-types]
    

    エラー定義:
    typedef struct{
        int val;
        struct Node *pNext;
    }Node;
    

    正しい定義:
    typedef struct Node{
        int val;
        struct Node *pNext;
    }Node;
    

    2、関数のパラメータタイプ定義エラーの定義:
    void ReverseList(LinkList* pList)
    

    正しい定義:
    void ReverseList(LinkList** pList)
    

    ポインタの指す内容を変えたいなら、チラシポインタok.この例では、ノードの値を変更したい場合は、ノード*を渡します.ポインタの指す位置を変更したい場合は、ダブルポインタを渡します.