Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

C ++ Pairwise Swap Element ของรายการที่เชื่อมโยงที่กำหนด


ในการแก้ปัญหาที่เราจำเป็นต้องสลับโหนดแบบคู่ที่มีอยู่ในรายการที่เชื่อมโยงแล้วพิมพ์ออกมา ตัวอย่างเช่น

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

มีสองวิธีในการแก้ปัญหาทั้งสองแบบเพื่อให้มีเวลาที่ซับซ้อนของ 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 และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์