এবার আমরা সিংগলি লিঙ্কড লিস্ট এ ডিলিট করা রিকেপ করব।
শুরুতে আমরা দেখে নেই এনি পজিশনে ডিলিট করতে হলে সেটার ভিজুয়ালাইজেশনটা কেমন হবে।
ধরি আমরা এখানে ৩০ কে ডিলিট করতে চাই। তাহলে ডিলিট করার পর নিশ্চয়ই ২০ এর নেক্সটে ৪০ থাকবে। তাই এক্ষেত্রে আমাদের লুপ চালিয়ে টেম্প নোড নিয়ে ২০ এ যেয়ে থামতে হবে। অর্থাৎ যেই পজিশনে ডিলিট করব তার আগের পজিশনে যেয়ে থামতে হবে।
কোডঃ
Node *tmp = head;for(int i =1; i <= pos -1; i++)// লুপ চালিয়ে যেই পজিশনে ডিলিট করব তার আগের পজিশনে যেয়ে থামছি।{ tmp =tmp->next;}
এরপর আমরা ২০ এর নেক্সটে ৪০ কে দিয়ে দিতে পারি। এবং মাঝের ৩০ কে একটি ডিলিট নোডে রেখে দিতে পারি। তারপর ২০ এর নেক্সটে ৪০ কে দিয়ে দিতে পারি। এবং সবশেষে ৩০ কে ডিলিট করে দিতে পারি। এক্ষেত্রে অবশ্যই সিরিয়াল মেইনটেইন করতে হবে। আগে ২০ এর নেক্সটে ৪০ কে দিতে হবে তারপর ৩০ কে ডিলিট করতে হবে। শুরুতে ৩০ কে ডিলিট করে দিলে পরে আর ৪০ কে খুজে পাওয়া যাবে না।
কোডঃ
সবশেষে লিঙ্কড লিস্ট দেখতে এমন হবে।
সম্পুরন কোডঃ
এই কোড দিয়ে যেকোন পজিশনে নোড ডিলিট করা যাবে শুধু হেড ছাড়া। হেড ডিলিটটা আমরা নেক্সট আর্টিকেলে দেখব।
Node *deleteNode = tmp->next; // ৩০ কে একটি ডিলিট নোডে রেখে দেওয়া হচ্ছে।
tmp->next = tmp->next->next; // ২০ এর নেক্সটে ৪০ কে দেওয়া হচ্ছে।
delete deleteNode; // ৩০ কে ডিলিট করে দেওয়া হচ্ছে।
class Node
{
public:
int val;
Node *next;
Node(int val)
{
this->val = val;
this->next = NULL;
}
};
void print_linekd_list(Node *head)
{
Node *tmp = head;
while (tmp != NULL)
{
cout << tmp->val << " ";
tmp = tmp->next;
}
cout << endl;
}
int size(Node *head)
{
Node *tmp = head;
int count = 0;
while (tmp != NULL)
{
count++;
tmp = tmp->next;
}
return count;
}
void delete_node(Node *head, int pos)
{
Node *tmp = head;
for (int i = 1; i <= pos - 1; i++)
{
tmp = tmp->next;
}
Node *deleteNode = tmp->next;
tmp->next = tmp->next->next;
delete deleteNode;
}
int main()
{
Node *head = new Node(10);
Node *a = new Node(20);
Node *b = new Node(30);
Node *c = new Node(40);
Node *d = new Node(50);
head->next = a;
a->next = b;
b->next = c;
c->next = d;
print_linekd_list(head);
int pos;
cin >> pos; // ডিলিট করার পজিশন ইনপুট নিচ্ছি।
if (pos >= size(head)) // পজিশন যদি সাইজের সমান অথবা বেশি হয় তাহলে ইনভেলিড হবে। এক্ষেত্রে সাইজের সমান হলেও ইনভেলিড হবে কারন কোন লিঙ্কড লিস্ট এর সাইজ যদি ৫ হয় তাহলে তার নোড পজিশন থাকবে ০ থেকে ৪ পর্যন্ত। ৫ পজিশনে যেহেতু কোন নোড নেই তাই সেটি ডিলিটও করা যাবে না।
{
cout << "Invalid" << endl;
}
else
{
delete_node(head, pos); // ভেলিড হলে ডিলিট ফাংশনকে কল করা হচ্ছে।
}
print_linekd_list(head);
return 0;
}