リンクされたリスト内leetcode-24二十から二スイッチングノード

タイトル説明は
二つのスイッチングノードの隣接間に、リストが与えられると、交換にリストを返します。

あなたは、単に内部ノード値を変更しますが、実際のノード交換する必要がないことができます。

例:

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;      
}
公開された239元の記事 ウォン称賛17 ビュー30000 +

おすすめ

転載: blog.csdn.net/Z_Stand/article/details/104323775