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

C++-এ লিংকড লিস্টের একটি অংশ রিভার্স করা (Reverse Linked List II)


একটি লিংকড লিস্ট দেওয়া আছে। m থেকে n পজিশন পর্যন্ত নোডগুলো রিভার্স করতে হবে। এক পাসে করতে হবে। যেমন লিস্ট [1,2,3,4,5] এবং m=2, n=4 হলে রেজাল্ট [1,4,3,2,5]।

সমাধানের ধাপ:

  • দুটি মেথড থাকবে: reverseN() এবং reverseBetween()। reverseBetween() মূল মেথড।
  • একটি successor পয়েন্টার ডিক্লেয়ার (NULL) করব।
  • reverseN কাজ করবে: n=1 হলে successor := head->next, return head। last = reverseN(head->next, n-1)। head->next->next = head, head->next := successor, return last।
  • reverseBetween(): m=1 হলে return reverseN(head, n)। head->next = reverseBetween(head->next, m-1, n-1)। return head।

উদাহরণ

#include <bits/stdc++.h>
using namespace std;

class ListNode{
public:
    int val;
    ListNode *next;
    ListNode(int data){
        val = data;
        next = NULL;
    }
};

ListNode *make_list(vector<int> v){
    ListNode *head = new ListNode(v[0]);
    for(int i = 1; inext != NULL){
            ptr = ptr->next;
        }
        ptr->next = new ListNode(v[i]);
    }
    return head;
}

void print_list(ListNode *head){
    ListNode *ptr = head;
    cout << "[";
    while(ptr){
        cout << ptr->val << ", ";
        ptr = ptr->next;
    }
    cout << "]" << endl;
}

class Solution {
public:
    ListNode* successor = NULL;
    ListNode* reverseN(ListNode* head, int n ){
        if(n == 1){
            successor = head->next;
            return head;
        }
        ListNode* last = reverseN(head->next, n - 1);
        head->next->next = head;
        head->next = successor;
        return last;
    }
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        if(m == 1){
            return reverseN(head, n);
        }
        head->next = reverseBetween(head->next, m - 1, n - 1);
        return head;
    }
};

main(){
    Solution ob;
    vector<int> v = {1,2,3,4,5,6,7,8};
    ListNode *head = make_list(v);
    print_list(ob.reverseBetween(head, 2, 6));
}

ইনপুট

[1,2,3,4,5,6,7,8] 2 6

আউটপুট

[1, 6, 5, 4, 3, 2, 7, 8, ]

  1. C++ দিয়ে লিংকড লিস্টে প্রথম নন-রিপিটিং এলিমেন্ট বের করা

  2. C++ দিয়ে সর্টেড লিংকড লিস্টে মেডিয়ান (Median) বের করা

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

  4. সি++-এ লিংকড লিস্টের অল্টারনেট নোডগুলোর যোগফল