24 リンクリスト内のノードのペアごとの交換 - 仮想ヘッドノード
この質問を通じて、次のことが可能になります。
仮想ヘッド ノードについての理解を深めます。
基本的なデータ構造であるリンク リストの基本操作についての理解を深めます。
1.交換プロセス:
図に示すように、リンクリストが図のようになっていたとする。
ヘッド ノードの個別の説明を減らすために、ここでは仮想ヘッド ノードを使用して処理します。
図に示すように、「現在のポインタ」が現在の「スワップ ノード ペア」の前のノードを指すたびに、これにより「仮想ヘッド ノード」の形式でヘッド ノードを個別に議論する必要がなくなります。具体的な交換プロセスを次の図に示します。
2. 困難:
-
ループ終了条件:
連結リストの長さが偶数の場合、最新の「現在のポインタ」はノード 4 を指し、次の「スワップ ノード ペア」は存在しません。このときの終了条件は、
p->next==NULL
連結リストの長さが奇数の場合、最新の「現在のポインタ」はノード 4 を指し、残り 1 つのノードが残ります。このノードは処理する必要はありません。このときの終了条件は次のとおりです。
p->next->next==NULL
-
交換プロセス:
最初の交換を例に挙げます。
交換処理中はノード 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;
}