مرحبًا؟، مرحبًا بكم مرة أخرى في هذه السلسلة على القوائم المرتبطة. تعرفنا في مقالتنا الأخيرة على أساسيات القوائم المرتبطة، بما في ذلك تعريفها ومصطلحاتها واختلافها مع المصفوفات وأنواع القوائم المرتبطة. لقد وعدت بأننا سنتعمق أكثر في تنفيذ القوائم المرتبطة، لذلك دعونا نبدأ.
كما تعلمنا في المقالة السابقة، القوائم المرتبطة هي هياكل بيانات أساسية في عالم البرمجة. وهي تتكون من العقد، حيث تحتوي كل عقدة على بيانات ومرجع (أو رابط) للعقدة التالية (في قائمة مرتبطة بشكل فردي) أو كل من العقد التالية والسابقة (في قائمة مرتبطة بشكل مزدوج) في التسلسل. على عكس المصفوفات، لا تقوم القوائم المرتبطة بتخزين العناصر في مواقع الذاكرة المتجاورة، مما يسمح بعمليات الإدراج والحذف الفعالة.
يعد فهم مفهوم القائمة المرتبطة أمرًا بالغ الأهمية لإتقان هياكل البيانات والخوارزميات. في هذه المقالة، سنتعمق أكثر في تنفيذ القوائم المرتبطة، بدءًا من أساسيات القائمة المرتبطة بشكل فردي.
القائمة المرتبطة بشكل فردي هي أبسط نوع من القائمة المرتبطة، حيث تشير كل عقدة إلى العقدة التالية في التسلسل. تمامًا كما في الصورة أدناه.
الآن، حان الوقت لبدء تنفيذ عمليات أساسيات القائمة المرتبطة بشكل فردي. هلا فعلنا؟
لنبدأ بإنشاء فئة عقدة جديدة. ستحتوي فئة العقدة على مُنشئ يأخذ بيانات العقدة والمؤشر التالي الذي تم تعيينه في البداية على قيمة خالية.
// Node class for Singly Linked List class Node { constructor(data) { this.data = data; this.next = null; } }
يمكن تصور فئة العقدة التي تم إنشاؤها حديثًا (والتي تمثل عقدة في القائمة المرتبطة) على النحو التالي.
قبل أن نواصل، دعونا ننشئ مثيلًا جديدًا لفئة SinglyLinkedList الخاصة بنا والتي ستحتفظ بعمليات القائمة المرتبطة لدينا.
// Singly Linked List class class SinglyLinkedList { constructor() { this.head = null; } // Operations come here ? }
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . // Insert at the beginning insertAtBeginning(data) { const newNode = new Node(data); // Create a new node with the given data newNode.next = this.head; // Set the new node's next pointer to the current head this.head = newNode; // Update the head to be the new node } // Other operations come here ? // . // . // . }
شرح: الإدراج في البداية يشبه انضمام شخص جديد إلى السطر في المقدمة. يصبحون الشخص الأول الجديد، ويرتبطون بالشخص الأول السابق.
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . // Insert at the end insertAtEnd(data) { const newNode = new Node(data); // Create a new node with the given data // check if the list does not have a head i.e the list is empty // NOTE: Every non-empty linked list will have a head if (!this.head) { this.head = newNode; // If the list is empty, set the new node as the head return; } let current = this.head; // Start at the head of the list while (current.next) { current = current.next; // Move to the next node in the list by updating the current node } current.next = newNode; // Set the next pointer of the last node to the new node } // Other operations come here ? // . // . // . }
شرح: الإدراج في النهاية يشبه انضمام شخص إلى السطر في النهاية. نحتاج إلى السير حتى النهاية للعثور على آخر شخص، ثم ربطه بالشخص الجديد.
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . // Delete a node deleteNode(data) { if (!this.head) return; // If the list is empty, do nothing if (this.head.data === data) { this.head = this.head.next; // If the node to delete is the head, update the head to the next node return; } let current = this.head; while (current.next) { if (current.next.data === data) { current.next = current.next.next; // If the node to delete is found, update the next pointer to skip it return; } current = current.next; } } // Other operations come here ? // . // . // . }
شرح: حذف العقدة يشبه أن يقرر شخص ما في منتصف السطر المغادرة. نجد ذلك الشخص ونربط الذي قبله بالذي بعده.
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . // Search note search(data) { let current = this.head; // Start at the head of the list while (current) { if (current.data === data) { // If the data is found, return true return true; } current = current.next; // Move to the next node } return false; } // Other operations come here ? // . // . // . }
شرح: البحث عن عقدة يشبه محاولة العثور على شخص معين في السطر. نبدأ من المقدمة ونسأل كل شخص حتى نجده أو نصل إلى النهاية.
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . traverse() { let current = this.head; // Start at the head of the list while (current) { console.log(current.data); // Print the data of the current node current = current.next; // Move to the next node } } } // End of class
شرح: العبور يشبه السير في الصف وتحية كل شخص. نبدأ من الأمام ونواصل التحرك حتى نصل إلى النهاية.
في هذه المقالة، تعرفنا على العمليات الأساسية للقوائم المرتبطة وكيفية تنفيذها في JavaScript. في المقالة القادمة، سنتعرف على القوائم المرتبطة بشكل مزدوج.
تذكر أن إتقان القوائم المرتبطة يتطلب الممارسة. استمر في حل المشكلات وتنفيذ هياكل البيانات هذه في سيناريوهات مختلفة.
لضمان عدم تفويت أي جزء من هذه السلسلة وللتواصل معي لإجراء المزيد من المناقشات المتعمقة حول تطوير البرامج (الويب أو الخادم أو الهاتف المحمول أو الكشط / الأتمتة)، وهياكل البيانات والخوارزميات، وغيرها من التقنيات المثيرة المواضيع تابعوني على:
ترقبوا البرمجة وسعيدة ؟؟
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3