タイトル説明は
二つのスイッチングノードの隣接間に、リストが与えられると、交換にリストを返します。
あなたは、単に内部ノード値を変更しますが、実際のノード交換する必要がないことができます。
例:
1 - > 2 - > 3 - > 4を考えると、あなたは、2-> 1 - > 4 - > 3返す必要があります。
方法(再帰的):
ペアリングプロセスは、2つの部分問題ペアに複数のスイッチング素子に分解され
... N(K-1) - > N(K) - > N(K + 1) - > ...
もし後に、次いで、N(K + 1)は、今回交換を逆位置を完了した... - > N(K-1 ) - > N(K + 1) - > N(K) - > ...
ノード* P =頭- >次。
ヘッド- >次= P - >次。
P - >次=ヘッド。
次のことを達成するために:
ListNode* swapPairs(ListNode* head) {
if(head == NULL || head -> next == NULL) {
return head;
}
ListNode *p = head -> next;
head -> next = swapPairs(p -> next);
p -> next = head;
return p;
}
方法2(非再帰的):
現在のリストトラバーサル条件の終了中に仮想ヘッドノードの構成:
鎖長が偶数である場合、P->ネクスト>次= NULL
鎖長が奇数の場合、次にP->次= NULL
Pは、現在のノード上のノードは、次のノードは、2つの後の次の置換を表します。
2×2の点はに交換各フォーム後に同時に:
ノード2 - >次に=ノード1、
ノード1 - >次に=次に、
P - >次に= NODE2。
P =ノード1。
ListNode* swapPairs(ListNode* head) {
ListNode * dummHead = new ListNode(0);
dummHead->next = head;
ListNode *p = dummHead;
while(p->next && p->next->next){
ListNode * node1 = p->next;
ListNode * node2 = node1->next;
ListNode * next = node2->next;
node2->next = node1;
node1->next = next;
p->next = node2;
p = node1;
}
return dummHead->next;
}