リンク リスト内のノードのペアごとの交換 - 仮想ヘッド ノード

24 リンクリスト内のノードのペアごとの交換 - 仮想ヘッドノード

この質問を通じて、次のことが可能になります。

  1. 仮想ヘッド ノードについての理解を深めます。

  2. 基本的なデータ構造であるリンク リストの基本操作についての理解を深めます。

1.交換プロセス:

図に示すように、リンクリストが図のようになっていたとする。
7

ヘッド ノードの個別の説明を減らすために、ここでは仮想ヘッド ノードを使用して処理します。
7

図に示すように、「現在のポインタ」が現在の「スワップ ノード ペア」の前のノードを指すたびに、これにより「仮想ヘッド ノード」の形式でヘッド ノードを個別に議論する必要がなくなります。具体的な交換プロセスを次の図に示します。

2. 困難:
  1. ループ終了条件:

    連結リストの長さが偶数の場合、最新の「現在のポインタ」はノード 4 を指し、次の「スワップ ノード ペア」は存在しません。このときの終了条件は、p->next==NULL

    連結リストの長さが奇数の場合、最新の「現在のポインタ」はノード 4 を指し、残り 1 つのノードが残ります。このノードは処理する必要はありません。このときの終了条件は次のとおりです。p->next->next==NULL

  2. 交換プロセス:

    最初の交換を例に挙げます。

    交換処理中はノード 1 とノード 2 が切断されるため、事前に保存する必要があります。

     while(p->next && p->next->next){
          
          
            ListNode* nextP = p->next;  // 保存第一个待交换对的第一个节点
            ListNode* nextNextP = p->next->next->next;  // 保存第二个待交换对的第一个节点
            p->next = p->next->next;  // 完成步骤一
            p->next->next = nextP;  // 完成步骤二
            nextP->next = nextNextP; // 完成步骤三
            p = p->next->next;  // 更新p到下一个交换节点对的前一个节点(当前交换节点对的第二个节点)
        }
    
3. コード:
 ListNode* swapPairs(ListNode* head) {
    
       
     ListNode* dummyHead = new ListNode();
     dummyHead->next = head;
     ListNode* p = dummyHead;
     while(p->next && p->next->next){
    
    
         ListNode* next1P = p->next;  // 保存第一个待交换对的第一个节点
         ListNode* next3P = p->next->next->next;  // 保存第二个待交换对的第一个节点
         p->next = p->next->next;  // 完成步骤一
         p->next->next = next1P;  // 完成步骤二
         next1P->next = next3P; // 完成步骤三
         p = p->next->next;  // 更新p到下一个交换节点对的前一个节点(当前交换节点对的第二个节点)
     }
     ListNode* temp = dummyHead->next;
     delete dummyHead;
     return temp;
 }

おすすめ

転載: blog.csdn.net/qq_44733706/article/details/128505839