কম্পিউটার টিউটোরিয়াল

সি++-এ ডাবলি লিংকড সার্কুলার লিস্ট


ডাবলি লিংকড সার্কুলার লিস্টে লাস্ট নোডের `next` ফার্স্ট নোডকে পয়েন্ট করে এবং ফার্স্ট নোডের `prev` লাস্ট নোডকে পয়েন্ট করে। এটি উভয় দিকে সার্কুলার।

এলগরিদম (মূল অপারেশন)

displayForward(): head থেকে next ফলো করে প্রিন্ট
displayBackward(): last থেকে prev ফলো করে প্রিন্ট
insertFirst(key, data): হেডে নোড যোগ
insertLast(key, data): লাস্টে নোড যোগ
insertAfter(key, newKey, data): নির্দিষ্ট কীর পরে ইনসার্ট
deleteFirst(): হেড ডিলিট
deleteLast(): লাস্ট ডিলিট
deleteNode(key): নির্দিষ্ট কী ওয়ালা নোড ডিলিট

উদাহরণ কোড

#include <iostream> 
using namespace std; 

class node {
public:
    int data, key;
    node *next, *prev;
};

node *head = NULL, *last = NULL;

bool isEmpty(){ return head == NULL; }

void displayForward(){
    node *ptr = head;
    cout << "\n[ ";
    while(ptr != NULL){
        cout << "(" << ptr->key << "," << ptr->data << ") ";
        ptr = ptr->next;
    }
    cout << "]";
}

void displayBackward(){
    node *ptr = last;
    cout << "\n[ ";
    while(ptr != NULL){
        cout << "(" << ptr->key << "," << ptr->data << ") ";
        ptr = ptr->prev;
    }
    cout << "]";
}

void insertFirst(int key, int data){
    node *link = new node();
    link->key = key; link->data = data;
    if(isEmpty()) last = link;
    else head->prev = link;
    link->next = head;
    head = link;
}

void insertLast(int key, int data){
    node *link = new node();
    link->key = key; link->data = data;
    if(isEmpty()) last = link;
    else { last->next = link; link->prev = last; }
    last = link;
}

node* deleteFirst(){
    node *temp = head;
    if(head->next == NULL) last = NULL;
    else head->next->prev = NULL;
    head = head->next;
    return temp;
}

node* deleteLast(){
    node *temp = last;
    if(head->next == NULL) head = NULL;
    else last->prev->next = NULL;
    last = last->prev;
    return temp;
}

node* del(int key){
    node *curr = head, *prev = NULL;
    if(head == NULL) return NULL;
    while(curr->key != key){
        if(curr->next == NULL) return NULL;
        prev = curr; curr = curr->next;
    }
    if(curr == head) head = head->next;
    else prev->next = curr->next;
    if(curr == last) last = curr->prev;
    else curr->next->prev = curr->prev;
    return curr;
}

bool insertAfter(int key, int newKey, int data){
    node *curr = head;
    if(head == NULL) return false;
    while(curr->key != key){
        if(curr->next == NULL) return false;
        curr = curr->next;
    }
    node *newLink = new node();
    newLink->key = newKey; newLink->data = data;
    if(curr == last){ newLink->next = NULL; last = newLink; }
    else { newLink->next = curr->next; curr->next->prev = newLink; }
    newLink->prev = curr; curr->next = newLink;
    return true;
}

int main(){
    insertFirst(1,10); insertFirst(2,20); insertFirst(3,30);
    insertFirst(4,1); insertFirst(5,40); insertFirst(6,56);
    displayForward(); displayBackward();
    deleteFirst(); displayForward();
    deleteLast(); displayForward();
    insertAfter(4,7,13); displayForward();
    del(4); displayForward();
    return 0;
}

আউটপুট

List (First to Last): [ (6,56) (5,40) (4,1) (3,30) (2,20) (1,10) ]
List (Last to first): [ (1,10) (2,20) (3,30) (4,1) (5,40) (6,56) ]
After deleting first: [ (5,40) (4,1) (3,30) (2,20) (1,10) ]
After deleting last: [ (5,40) (4,1) (3,30) (2,20) ]
Insert after key(4): [ (5,40) (4,1) (7,13) (3,30) (2,20) ]
After delete key(4): [ (5,40) (7,13) (3,30) (2,20) ]

  1. জাভাস্ক্রিপ্টে ডাবলি লিংকড লিস্টকে সার্কুলার (Circular) করা

  2. মাল্টিলেভেল লিংকড লিস্ট ফ্ল্যাটেন করা (C++)

  3. C++-এ দুটি লিঙ্কড লিস্টের ইন্টারসেকশন পয়েন্ট খুঁজে বের করা

  4. C++-এ সার্কুলার লিঙ্কড লিস্টে নোড গণনা