C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

特定のリンクリストのC++ペアワイズスワップ要素


たとえば、リンクリストに存在するペアワイズノードを交換してから印刷する必要があるという問題を解決するには

Input : 1->2->3->4->5->6->NULL

Output : 2->1->4->3->6->5->NULL

Input : 1->2->3->4->5->NULL

Output : 2->1->4->3->5->NULL

Input : 1->NULL

Output : 1->NULL

ソリューションにアプローチする方法は2つあり、どちらもO(N)の時間計算量を持ちます。ここで、Nは提供されたリンクリストのサイズであるため、次に両方のアプローチを検討します

反復アプローチ

このアプローチでは、リンクリスト要素を繰り返し処理し、NULLに達するまでペアごとに交換します。

#include <bits/stdc++.h>
using namespace std;
class Node { // node of our list
public:
    int data;
    Node* next;
};
void swapPairwise(Node* head){
    Node* temp = head;
    while (temp != NULL && temp->next != NULL) { // for pairwise swap we need to have 2 nodes hence we are checking
        swap(temp->data,
            temp->next->data); // swapping the data
        temp = temp->next->next; // going to the next pair
    }
}
void push(Node** head_ref, int new_data){ // function to push our data in list
    Node* new_node = new Node(); // creating new node
    new_node->data = new_data;
    new_node->next = (*head_ref); // head is pushed inwards
    (*head_ref) = new_node; // our new node becomes our head
}
void printList(Node* node){ // utility function to print the given linked list
    while (node != NULL) {
       cout << node->data << " ";
       node = node->next;
    }
}
int main(){
    Node* head = NULL;
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
    cout << "Linked list before\n";
    printList(head);
    swapPairwise(head);
    cout << "\nLinked list after\n";
    printList(head);
    return 0;
}

出力

Linked list before
1 2 3 4 5
Linked list after
2 1 4 3 5

次のアプローチでも同じ式を使用しますが、再帰を繰り返します。

再帰的アプローチ

このアプローチでは、再帰を使用して同じロジックを実装しています。

#include <bits/stdc++.h>
using namespace std;
class Node { // node of our list
public:
    int data;
    Node* next;
};
void swapPairwise(struct Node* head){
    if (head != NULL && head->next != NULL) { // same condition as our iterative
        swap(head->data, head->next->data); // swapping data
        swapPairwise(head->next->next); // moving to the next pair
    }
    return; // else return
}
void push(Node** head_ref, int new_data){ // function to push our data in list
    Node* new_node = new Node(); // creating new node
    new_node->data = new_data;
    new_node->next = (*head_ref); // head is pushed inwards
    (*head_ref) = new_node; // our new node becomes our head
}
void printList(Node* node){ // utility function to print the given linked list
    while (node != NULL) {
        cout << node->data << " ";
        node = node->next;
    }
}
int main(){
    Node* head = NULL;
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
    cout << "Linked list before\n";
    printList(head);
    swapPairwise(head);
    cout << "\nLinked list after\n";
    printList(head);
    return 0;
}

出力

Linked list before
1 2 3 4 5
Linked list after
2 1 4 3 5

上記のコードの説明

このアプローチでは、リンクリストをペアでトラバースします。ここで、ペアに到達すると、データを交換して次のペアに移動します。これにより、プログラムは両方の方法で進行します。

結論

このチュートリアルでは、再帰と反復を使用して、特定のリンクリストのペアワイズスワップ要素を解決します。また、この問題のC ++プログラムと、この問題を解決するための完全なアプローチ(通常)についても学びました。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。このチュートリアルがお役に立てば幸いです。


  1. C++のリンクリストの代替ノードの合計

    この問題では、リンクリストが表示されます。私たちのタスクは、リンクリストの代替ノードの合計を出力することです。 リンクリストは、リンクを介して相互に接続された一連のデータ構造です。 では、問題に戻りましょう。ここでは、リンクリストの代替ノードを追加します。これは、ノードが位置0、2、4、6、…であることを追加することを意味します 問題を理解するために例を見てみましょう。 入力 4 → 12 → 10 → 76 → 9 → 26 → 1 出力 24 説明 considering alternate strings

  2. リンクリストがC++でペアワイズソートされているかどうかを確認します

    n個の要素を持つリストLがあります。リストがペアごとにソートされているかどうかを確認する必要があります。リストが{8、10、18、20、5、15}のようなものだとします。これは、(8、10)、(18、20)、(5、15)がソートされるようにペアごとにソートされます。リストに奇数の要素がある場合、最後の要素は無視されます。 アプローチは単純すぎます。数字を左から右にトラバースします。 2つの連続する要素が取得され、それらがソートされているかどうかを確認します。いずれかのペアがソートされていない場合はfalseを返し、ペアが見つからない場合、つまりソートされていない場合はtrueを返します。 例