أفضل 40 سؤالاً وجواباً في مقابلات العمل المتعلقة بالقوائم المتصلة (2026)

أسئلة وأجوبة مقابلات العمل في قائمة لينكدإن

يتطلب الاستعداد لمقابلة عمل في مجال هياكل البيانات التركيز على التحديات. تكشف أسئلة المقابلة المتعلقة بالقوائم المتصلة عن عمق مهارات حل المشكلات، ومنطق المؤشرات، والوعي بالذاكرة، وكيفية تعامل المرشحين مع الحالات الاستثنائية.

يُتيح إتقان القوائم المترابطة فرصًا وظيفية في فرق المنتجات والمنصات وهندسة الأنظمة. وتُسهم الخبرة العملية في بناء خبرة تقنية قوية، ومهارات التفكير التحليلي، وعادات كتابة أكواد برمجية سليمة. من حديثي التخرج إلى المحترفين ذوي الخبرة، تدعم هذه المهارات تصحيح الأخطاء، وتحليل الأداء، وتوجيه الموظفين الجدد، والتعاون مع المدراء في إيجاد حلول قابلة للتطوير باستخدام مفاهيم متقدمة مستمدة من الخبرة.
اقرأ أكثر…

👈 تحميل مجاني بصيغة PDF: أسئلة وأجوبة مقابلات باستخدام القوائم المتصلة

أسئلة وأجوبة مقابلات العمل في قائمة لينكدإن

1) اشرح ما هي القائمة المرتبطة وكيف تختلف عن المصفوفة.

A قائمة مرتبطة هي بنية بيانات خطية حيث ترتبط العناصر، التي تُسمى عُقدًا، باستخدام مؤشرات أو مراجع. تحتوي كل عقدة على بيانات ومؤشر/مرجع إلى العقدة التالية في القائمة. على عكس المصفوفات، لا تخزن القوائم المرتبطة العناصر في ذاكرة متجاورة.

الاختلافات الرئيسية بين القائمة المرتبطة والمصفوفة:

الميزات قائمة مرتبطة مجموعة
تخصيص الذاكرة التفاعل ساكن
وقت الوصول إلى العنصر O (ن) يا (1)
الإدراج/الحذف كفؤ (في أي منصب) مكلف (يحتاج إلى نقل)
الذاكرة العلوية مساحة إضافية للمؤشرات لا توجد تكاليف إضافية للمؤشر

باختصار، تقوم القوائم المرتبطة بالموازنة بين عمليات الإدخال الأسرع والتحجيم الديناميكي مقابل الوصول العشوائي الأبطأ وزيادة الحمل الزائد على الذاكرة بسبب المؤشرات.


2) ما هي الأنواع المختلفة للقوائم المرتبطة؟

هناك أنواع عديدة من القوائم المرتبطةوغالباً ما يطلب منك القائمون على المقابلات التمييز بينها:

  • قائمة مرتبطة أحادية: تشير كل عقدة إلى العقدة التالية فقط.
  • القائمة المرتبطة بشكل مضاعف: تحتوي العقد على نقطتان: واحد إلى العقدة التالية وواحد إلى العقدة السابقة.
  • قائمة مرتبطة دائرية: تشير العقدة الأخيرة إلى العقدة الأولى، مما يشكل حلقة.
  • قائمة مرتبطة دائرية مزدوجة: يجمع بين القوائم الدائرية والقوائم المرتبطة بشكل مزدوج.

لكل نوع حالات استخدام مختلفة بناءً على متطلبات التصفح والذاكرة. على سبيل المثال، تسمح القوائم المرتبطة ثنائياً بالتصفح العكسي بسهولة على حساب مؤشرات إضافية.


3) كيف تعكس ترتيب عناصر قائمة مرتبطة أحادية؟ (باستخدام البرمجة)

Revيُعدّ تغيير اتجاه القائمة المتصلة سؤالًا كلاسيكيًا في مقابلات العمل. والهدف هو تغيير اتجاه المؤشرات بحيث يتم عكس ترتيب القائمة في مكانها دون إنشاء عقد جديدة.

الفكرة الرئيسية:
استخدم ثلاثة مؤشرات — prev, currو next — ثم قم بالمرور على القائمة. في كل خطوة، قم بإعادة التوجيه curr.next إلى prevثم قم بتحريك جميع المؤشرات.

ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev; // New head
}

يؤدي هذا إلى تحويل البنية المرتبطة دون مساحة إضافية، ويستمر في العمل. O (ن) مرة.


4) اشرح تقنية المؤشرين لإيجاد منتصف القائمة المرتبطة.

الطريقة الأكثر فعالية للعثور على العقدة الوسطى في قائمة مرتبطة هي استخدام مؤشرين:

  • A مؤشر بطيء يتحرك عقدة واحدة في كل مرة.
  • A مؤشر سريع يحرك عقدتين في كل مرة.

عندما يصل المؤشر السريع إلى النهاية، سيكون المؤشر البطيء عند نقطة المنتصف. تعمل هذه التقنية في O (ن) الوقت بدون مساحة إضافية.


5) كيف يمكنك اكتشاف وجود حلقة في قائمة مرتبطة؟

يُعدّ اكتشاف الدورات مشكلة كلاسيكية أخرى. ويستخدم الحل القياسي فلويد Torخوارزمية السلحفاة والأرنب:

  • تحرك slow pointer خطوة واحدة في وقت واحد.
  • تحرك fast pointer خطوتين في كل مرة.
  • إذا كانت القائمة تحتوي على حلقة، فسيلتقي المؤشران.

إذا وصل المؤشر السريع nullلا تحتوي القائمة على دورة. يتم تشغيل هذه الطريقة في O (ن) الوقت و يا (1) الفضاء.


6) ما هي مزايا وعيوب القوائم المرتبطة؟

توفر القوائم المرتبطة العديد من المزايا والعيوب:

المزايا عيوب
الحجم الديناميكي لا يوجد وصول عشوائي
سهولة الإضافة/الحذف ذاكرة إضافية للمؤشرات
فعال في التعامل مع البيانات المتنامية أداء ضعيف لذاكرة التخزين المؤقت

تُعدّ القوائم المرتبطة فعالة للبيانات الديناميكية، ولكنها قد تكون أبطأ من المصفوفات للوصول إلى العناصر لأن كل عملية وصول تتطلب المرور من الرأس.


7) كيف يمكنك دمج قائمتين مرتبطتين مرتبة؟

يُعدّ دمج قائمتين مُرتبتين من المسائل الشائعة في مقابلات العمل. وتتلخص الفكرة في استعراض القائمتين معًا، ثم إنشاء قائمة مُرتبة جديدة باختيار العنصر الأصغر من أيٍّ من القائمتين في كل خطوة.

ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    ListNode dummy = new ListNode(0);
    ListNode tail = dummy;
    while (l1 != null && l2 != null) {
        if (l1.val < l2.val) {
            tail.next = l1;
            l1 = l1.next;
        } else {
            tail.next = l2;
            l2 = l2.next;
        }
        tail = tail.next;
    }
    tail.next = (l1 != null) ? l1 : l2;
    return dummy.next;
}

تحافظ هذه الطريقة على الترتيب المصنف وتعمل في O(n + m) الوقت اللازم لقوائم ذات أطوال n و m.


8) اشرح كيفية حذف العقدة رقم N من نهاية القائمة المرتبطة.

تستخدم التقنية الأكثر فعالية نقطتان يفصل بينهما عدد n من العقد. حرك المؤشر الأول n خطوة، ثم حرك كلا المؤشرين حتى يصل الأول إلى النهاية. عندها سيكون المؤشر الثاني قبل العقدة المستهدفة مباشرةً.

هذا يتجنب حساب طول القائمة بشكل منفصل ويكمل العملية في O (ن) الوقت. كما أنه يعالج الحالات الشاذة مثل إزالة العقدة الأولى.


9) ما هو التعقيد الزمني للوصول إلى العنصر رقم k في قائمة مرتبطة؟

الوصول إلى kيتطلب الوصول إلى العنصر رقم 1 في القائمة المرتبطة اجتيازًا من الرأس حتى تصل إلى العنصر رقم 2. kالعقدة رقم 1. ولأن القوائم المرتبطة لا توفر فهرسة مباشرة، فإن هذا يكلف O (ن) الوقت في أسوأ الأحوال.

في المقابل، تدعم المصفوفات الفهرسة المباشرة في يا (1) مرة.


10) لماذا قد تستخدم قائمة مرتبطة بدلاً من مصفوفة؟

تُعد القوائم المتصلة مفيدة بشكل خاص عندما:

  • تتوقع عمليات إدخال وحذف متكررة في مواقع عشوائية.
  • أنت لا تعرف حجم بياناتك مسبقاً.
  • يؤدي تجزئة الذاكرة إلى صعوبة تخصيص الذاكرة المتجاورة.

إنها تدعم تخصيص الذاكرة الديناميكي الفعال والإدراج/الحذف في الوقت الثابت عند نهايات القائمة أو مع مرجع عقدة معروف - وهي مزايا لا يمكن للمصفوفات أن تضاهيها.


11) ما هي التطبيقات العملية للقوائم المتصلة؟

تُستخدم القوائم المتصلة على نطاق واسع في الأنظمة التي تخصيص الذاكرة الديناميكية, عمليات إدخال متكررة أو هياكل البيانات ذات الأحجام المتغيرة وهي مطلوبة. يتم تطبيقها في العديد من المفاهيم والتطبيقات الأساسية في علوم الحاسوب مثل:

  • إدارة الذاكرة الديناميكية (يستخدم في أنظمة التشغيل)
  • وظائف التراجع/الإعادة في محررات النصوص
  • تسلسل جداول التجزئة لحل التصادمات
  • التنقل بين قوائم تشغيل الموسيقى أو الفيديو
  • تمثيل تجاور الرسم البياني
  • العمليات الحسابية على كثيرات الحدود

تُبرز هذه الأمثلة كيف توفر القوائم المرتبطة المرونة والمعالجة الفعالة للتسلسلات حيث يكون تغيير حجم المصفوفة مكلفًا.


12) اشرح الفرق بين القائمة المرتبطة بشكل فردي والقائمة المرتبطة بشكل مزدوج.

الميزات قائمة مرتبطة بشكل فردي قائمة مرتبطة بشكل مضاعف
Pointers 1 (العقدة التالية فقط) 2 (السابق والتالي)
اجتياز اتجاه واحد فقط كلا الاتجاهين
استخدام الذاكرة Less (مؤشر واحد فقط) المزيد (مؤشر إضافي)
شطب أصعب (يتطلب العقدة السابقة) أسهل
استخدام المثال تنفيذ المكدس تصفح سجل المتصفح

A قائمة مرتبطة مزدوجة يتميز بتعدد استخداماته ولكنه يستهلك ذاكرة إضافية. في المقابل، قوائم مرتبطة منفردة خفيفة الوزن وفعالة للتنقل في اتجاه واحد.


13) كيف يمكنك إزالة العناصر المكررة من قائمة مرتبطة مرتبة؟

عندما تكون القائمة المرتبطة مرتبة بالفعل، ستكون العناصر المكررة متجاورة.

تصفح القائمة وقارن بيانات كل عقدة مع بيانات العقدة التالية لها. إذا تطابقت البيانات، فتجاوز العقدة التالية.

void removeDuplicates(ListNode head) {
    ListNode current = head;
    while (current != null && current.next != null) {
        if (current.val == current.next.val) {
            current.next = current.next.next;
        } else {
            current = current.next;
        }
    }
}

تعقيد: زمن O(n) ومساحة O(1).

بالنسبة للقوائم غير المرتبة، يمكن استخدام HashSet لـ tracالقيم التي تم رصدها (k).


14) ما الفرق بين القائمة المرتبطة الخطية والقائمة المرتبطة الدائرية؟

الميزات قائمة مرتبطة خطية قائمة مرتبطة دائرية
العقدة الأخيرة يشير إلى قيمة فارغة يشير إلى العقدة الرئيسية
اجتياز ينتهي عندما next == NULL التنقل المستمر
الحلول المقترحة مكدس، طابور جدولة جولة روبن
تعقيد بساطة معالجة أكثر تعقيدًا

تُعد القوائم الدائرية مفيدة بشكل خاص في تطبيقات مثل جدولة وحدة المعالجة المركزية، حيث يتم تنفيذ العمليات بشكل دوري.


15) كيف تجد نقطة التقاطع لقائمتين مرتبطتين؟

لتحديد ما إذا كانت قائمتان مرتبطتان بشكل فردي تتقاطعان:

  1. أوجد طول كلتا القائمتين.
  2. قم بتحريك مؤشر القائمة الأطول بمقدار الفرق في الأطوال.
  3. قم بتصفح كلا القائمتين في وقت واحد حتى تصبح العقد متطابقة.

أو بدلاً من ذلك ، أ HashSet يمكن استخدامها لتخزين العقد التي تمت زيارتها في مساحة O(n).

هذا الأسلوب فعال ويُطرح عادةً في مقابلات العمل على مستوى الإدارة العليا.


16) كيف يمكنك التحقق مما إذا كانت قائمتان مرتبطتان متطابقتين؟

تكون قائمتان مرتبطتان متطابقتين إذا:

  • لديهم نفس عدد العقد.
  • تكون قيم العقدة المقابلة متطابقة بالترتيب.

الخوارزمية:

  1. تصفح كلا القائمتين معًا.
  2. قارن بيانات كل عقدة.
  3. إذا تطابقت جميع الأزواج ووصل كلاهما إلى قيمة فارغة (NULL)، فإنهما متطابقان.

التعقيد الزمني: O (ن)

تعقيد المساحة: يا (1)


17) ما هو تسرب الذاكرة في سياق القوائم المرتبطة؟

A تسريب ذاكرة يحدث ذلك عندما لا يتم تحرير العقد المخصصة ديناميكيًا بعد استخدامها.

في القوائم المرتبطة، إذا delete or free() لا يتم استدعاء الدالة على العقد التي تمت إزالتها من القائمة، وتبقى الذاكرة مشغولة على الرغم من أنها لم تعد قابلة للوصول.

على سبيل المثال، فشل تحرير العقد المحذوفة في لغة C/C++ يؤدي ذلك إلى استنزاف تدريجي للذاكرة، مما يتسبب في تباطؤ النظام أو تعطلّه.

يمكن تجنب هذه المشكلة عن طريق التنظيف السليم باستخدام أداة التدمير أو إلغاء التخصيص الصريح.


18) اشرح كيفية تنفيذ مكدس باستخدام قائمة مرتبطة.

في باقة كومة، تتبع العناصر ترتيب LIFO (آخر ما يدخل، أول ما يخرج).

تُعد القائمة المرتبطة مثالية لأن عمليات الإضافة والحذف تتم بكفاءة في رأس القائمة.

Operaنشوئها:

  • دفع: أضف عقدة جديدة في بداية الصفحة.
  • فرقعة: قم بإزالة العقدة من الرأس.
  • نظرة خاطفة: إرجاع بيانات الرأس.

المزايا:
لا حاجة لمصفوفة ذات حجم ثابت؛ فهي تنمو ديناميكيًا مع إضافة العناصر.


19) كيف يمكن استخدام القائمة المرتبطة لتنفيذ قائمة انتظار؟

في باقة طابور، تتبع العناصر ترتيب FIFO (الأول في الأول خارج).

استخدم قائمة مرتبطة حيث:

  • إضافة إلى قائمة الانتظار (إدراج): أضف عقدة في النهاية.
  • إزالة من قائمة الانتظار (إزالة): احذف العقدة من الرأس.

وهذا يسمح بالعمليتين في يا (1) الوقت مع مؤشرين — front و rear.

يُستخدم بشكل شائع في جدولة العمليات وأنظمة قوائم انتظار الطابعات.


20) ما هي الاختلافات بين قائمة المصفوفة والقائمة المرتبطة في Java?

البعد ArrayList لينكدليست
التخزين مصفوفة ديناميكية قائمة مرتبطة مزدوجة
وقت الوصول يا (1) O (ن)
إدراج/حذف مكلف في المتوسط فعال في الأطراف
الذاكرة العلوية Less المزيد (نصائح إضافية)
الحلول المقترحة الوصول المتكرر عمليات الإدخال/الحذف المتكررة

على سبيل المثال: استعمل ArrayList بالنسبة للعمليات التي تتطلب عمليات بحث مكثفة، و LinkedList عندما تسود عمليات الإضافة/الحذف.


21) كيف يمكنك تسطيح قائمة مرتبطة متعددة المستويات؟

A قائمة مرتبطة متعددة المستويات قد تحتوي على عقد تمتلك كلا next و child المؤشرات (كل عنصر فرعي يؤدي إلى قائمة مرتبطة أخرى). الهدف هو تسطيح جميع العقد في قائمة مرتبطة ذات مستوى واحد.

النهج:

  1. إستخدم كومة or وظيفة العودية.
  2. ابدأ من العقدة الرئيسية.
  3. إذا كانت العقدة تحتوي على child، ادفعها next أضف العقدة إلى المكدس، واجعلها child as next.
  4. استمر حتى تصبح المجموعة فارغة.

تعقيد الوقت: O (ن)

تعقيد الفضاء: O(n) للتكرار/المكدس.

مثال (من الناحية المفاهيمية):

1 - 2 - 3
    |
    4 - 5
Flattened → 1 → 2 → 4 → 5 → 3

يقيس هذا السؤال فهمك للتكرار ومعالجة المؤشرات.


22) كيف يمكنك استنساخ قائمة مرتبطة بمؤشرات عشوائية؟

تحتوي كل عقدة في هذه القائمة المرتبطة الخاصة على مؤشرين:

  • next يشير → إلى العقدة التالية.
  • random يشير الرمز → إلى أي عقدة عشوائية.

الخوارزمية (3 خطوات):

  1. أدخل العقد المستنسخة بين العقد الأصلية.
  2. قم بتعيين مؤشرات عشوائية للنسخ (clone.random = original.random.next).
  3. افصل القائمتين.

هذا يتجنب الحاجة إلى مساحة إضافية لخريطة التجزئة ويعمل في O (ن) الوقت مع يا (1) مساحة إضافية.

حالة الاستخدام: نسخ عميق لهياكل البيانات المعقدة (مثل الرسوم البيانية أو مراجع الكائنات).


23) ما هي قائمة التخطي، وكيف ترتبط بالقوائم المرتبطة؟

A قائمة التخطي هي بنية قائمة مرتبطة متعددة الطبقات تسمح بالبحث السريع والإدراج والحذف (على غرار الأشجار المتوازنة).

تشغيل متوسط ​​الوقت الحالة الأسوأ
البحث O (تسجيل ن) O (ن)
إدراج/حذف O (تسجيل ن) O (ن)

يحتوي على مستويات متعددة، حيث "تتخطى" المستويات العليا عدة عقد، مما يحسن كفاءة البحث.

على سبيل المثال: تُستخدم في قواعد البيانات مثل Redis وتطبيقات الخرائط المتزامنة.


24) كيف يمكنك اكتشاف كلمة متناظرة في قائمة مرتبطة؟

تُعتبر القائمة المرتبطة متناظرة إذا كانت تُقرأ بنفس الطريقة من اليمين إلى اليسار ومن اليسار إلى اليمين.

الخوارزمية:

  1. ابحث عن منتصف القائمة.
  2. Reverse الشوط الثاني.
  3. قارن بين النصفين عقدة بعقدة.

إذا تطابقت جميع العقد المتناظرة، فإنها تكون كلمة متناظرة.

على سبيل المثال:

1 → 2 → 3 → 2 → 1 → ✅ كلمة متناظرة

1 → 2 → 3 → 4 → ❌ ليس كلمة متناظرة

تعقيد الوقت: O (ن)

تعقيد الفضاء: يا (1)


25) كيف يمكنك إزالة الحلقة في قائمة مرتبطة؟

إذا كانت هناك حلقة تكرارية (باستخدام خوارزمية فلويد لاكتشاف الحلقات)، فقم بإزالتها باتباع هذه الخطوات:

  1. اكتشف نقطة التقاء المؤشرات البطيئة والسريعة.
  2. حرك مؤشرًا واحدًا إلى الرأس.
  3. حرك كلا المؤشرين خطوة واحدة في كل مرة حتى يلتقيا عند النقطة عقدة بداية الحلقة.
  4. قم بتعيين العقدة السابقة next إلى null.

يضمن هذا النهج عدم استخدام ذاكرة إضافية أثناء حل الحلقات.


26) ما هي الطرق المختلفة لتمثيل القوائم المرتبطة في الذاكرة؟

يمكن تمثيل القوائم المرتبطة في ثلاث طرق رئيسية:

نوع التمثيل الوصف استخدام المثال
العقد الديناميكية يتم تخصيص كل عقدة وربطها ديناميكيًا C, C++
تمثيل المصفوفة الثابتة يستخدم مؤشرات المصفوفة بدلاً من المؤشرات الأنظمة المضمنة
الكائنات المرتبطة تمثيل كائني التوجه باستخدام الفئات Java, Python

كل نهج يناسب بيئات مختلفة - على سبيل المثال، يتم استخدام القوائم القائمة على المصفوفات عندما تكون معالجة المؤشرات مقيدة.


27) كيف يمكنك إيجاد طول القائمة المرتبطة (التكرارية والتكرارية)؟

نهج تكراري:

int getLength(ListNode head) {
    int count = 0;
    while (head != null) {
        count++;
        head = head.next;
    }
    return count;
}

النهج التكراري:

int getLength(ListNode head) {
    if (head == null) return 0;
    return 1 + getLength(head.next);
}

كلا النهجين لهما O (ن) التعقيد الزمني؛ يضيف التكرار O (ن) زيادة المساحة بسبب مكدس الاستدعاءات.


28) اشرح مفهوم القوائم الدائرية المرتبطة بشكل مزدوج مع مثال.

في باقة قائمة دائرية مزدوجة الارتباطتحتوي كل عقدة على رابطين - أحدهما إلى العقدة التالية والآخر إلى العقدة السابقة - ورابط العقدة الأخيرة next يشير إلى الرأس، بينما الرأس prev يشير إلى العقدة الأخيرة.

أمثلة على حالات الاستخدام:

  • أنظمة التشغيل في الوقت الحقيقي (جدولة التناوب الدوري)
  • قائمة تشغيل الموسيقىping
  • التنقل بين علامات التبويب أو الشرائح

المزايا:

  • اجتياز ثنائي الاتجاه.
  • لا توجد مراجع فارغة.
  • عمليات إدخال وحذف فعالة.

29) كيف تحذف العقد البديلة في قائمة مرتبطة؟

الخوارزمية:

  1. ابدأ من الرأس.
  2. احذف كل عقدة ثانية عن طريق تعديل المؤشرات.
  3. استمر حتى تنتهي القائمة.

على سبيل المثال:

Input: 1 → 2 → 3 → 4 → 5  
Output: 1 → 3 → 5

تعقيد:

  • الوقت: O(n)
  • المساحة: O(1)

يتحقق هذا من فهم عملية اجتياز المؤشر وسلامة الحذف.


30) كيف يمكنك إيجاد العقدة رقم n من بداية ونهاية قائمة مرتبطة؟

من البداية: قم بتصفح القائمة حتى يصبح العدد مساوياً لـ n.

من النهاية: استخدم مؤشرين.

  1. حرك المؤشر الأول n خطوة للأمام.
  2. حرك كليهما في وقت واحد حتى يصل الأول إلى الصفر.
  3. يشير المؤشر الثاني الآن إلى العقدة رقم n من النهاية.

تعقيد الوقت: O (ن)

تعقيد الفضاء: يا (1)

يتجنب هذا النهج حساب الطول بشكل منفصل، مما يحسن الكفاءة.


31) كيف يمكنك إعادة ترتيب قائمة مرتبطة؟

المشكلة: بالنظر إلى قائمة L0 → L1 → … → Ln-1 → Lnأعد ترتيبها على النحو التالي L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …

الخطوات التالية:

  1. ابحث عن منتصف القائمة.
  2. Reverse الشوط الثاني.
  3. قم بدمج النصفين بالتناوب.

على سبيل المثال:

Input: 1 → 2 → 3 → 4 → 5  
Output: 1 → 5 → 2 → 4 → 3

تعقيد: O(n) زمن، O(1) فضاء.

يختبر هذا السؤال عمليات متعددة على القوائم المرتبطة في سؤال واحد.


32) كيف تقوم بتقسيم قائمة مرتبطة حول قيمة معينة x؟

الهدف:
أعد ترتيب العقد بحيث تأتي جميع العقد الأقل من x قبل العقد الأكبر من أو تساوي x.

النهج:

  • احتفظ بقائمتين وهميتين: before و after.
  • قم بتصفح القائمة الأصلية وأضف العقد إلى القوائم ذات الصلة.
  • قم بدمجهما في النهاية.

على سبيل المثال:

Input: 3 → 5 → 8 → 5 → 10 → 2 → 1, x = 5  
Output: 3 → 2 → 1 → 5 → 8 → 5 → 10

يُطلب هذا بشكل متكرر لتقييم قدرة إعادة ترتيب البيانات.


33) كيف تقوم بفرز قائمة مرتبطة؟

بما أن القوائم المرتبطة لا تدعم الوصول العشوائي، دمج الفرز هو الخيار الافضل.

الخطوات التالية:

  1. قسّم القائمة إلى نصفين باستخدام مؤشرات بطيئة/سريعة.
  2. قم بفرز كل نصف بشكل متكرر.
  3. دمج النصفين المصنفين.

المزايا:

  • زمن O(n log n).
  • مساحة إضافية O(1) (للإصدار التكراري).

على عكس المصفوفات، فإن خوارزمية QuickSort غير فعالة بالنسبة للقوائم المرتبطة بسبب تعقيد إعادة ترتيب المؤشرات.


34) ما الفرق بين القوائم المرتبطة المفردة والمزدوجة والدائرية؟

الميزات منفردا على نحو مضاعف دائري
الروابط واحد (التالي) اثنان (السابق والتالي) تتصل العقدة الأخيرة بالعقدة الرئيسية
اجتياز إلى الأمام فقط للأمام والخلف إمكانية التنقل اللانهائي
الإدراج/الحذف معتدل أسهل من كلا الطرفين التعامل مع الحالات الخاصة
الحلول المقترحة مكدس، طابور عمليات التراجع جدولة جولة روبن

غالباً ما يظهر سؤال المقارنة هذا للتحقق من وضوح المفاهيم.


35) كيف تجد عقدة التقاطع لقائمتين دائريتين مرتبطتين؟

هذا امتداد لمشكلة التقاطع.

الخوارزمية:

  1. اكتشف ما إذا كانت كل قائمة تحتوي على حلقة تكرارية.
  2. إذا كان كلاهما غير دوري → استخدم خوارزمية التقاطع القياسية.
  3. إذا كان كلاهما دوريًا ← ابحث عن بداية الحلقة لكل منهما وتحقق مما إذا كانا متطابقين أو متصلين.

تتضمن هذه المشكلة الكشف عن الدورة الشهرية و منطق التقاطع، اختبار التفكير متعدد المفاهيم.


36) اشرح كيفية إدراج عقدة في قائمة مرتبطة مرتبة.

الخطوات التالية:

  1. أنشئ عقدة جديدة بالقيمة المعطاة.
  2. استمر في التحرك حتى تجد الموضع الصحيح.
  3. ضبط next المؤشرات وفقًا لذلك.

على سبيل المثال:

Input: 1 → 3 → 5 → 7, Insert 4  
Output: 1 → 3 → 4 → 5 → 7

هذه مسألة تلاعب أساسية لاختبار فهم تعديل المؤشر.


37) كيف يمكنك تقسيم قائمة مرتبطة إلى نصفين؟

الخوارزمية:

  • استخدم طريقة المؤشر البطيء والسريع.
  • متى fast يصل إلى النهاية، slow سيكون في نقطة المنتصف.
  • انقسم عند تلك العقدة.

على سبيل المثال:

Input: 1 → 2 → 3 → 4 → 5  
Output: 1 → 2 → 3  and  4 → 5

غالباً ما تكون هذه العملية هي الخطوة الأولى في فرز دمج القوائم المرتبطة.


38) كيف يمكنك إيجاد آخر ظهور لقيمة ما في قائمة مرتبطة؟

تصفح القائمة مع الحفاظ علىping track للعقدة الأخيرة التي تم العثور فيها على القيمة المستهدفة.

الشفرة الزائفة:

ListNode findLastOccurrence(ListNode head, int val) {
    ListNode result = null;
    while (head != null) {
        if (head.val == val) result = head;
        head = head.next;
    }
    return result;
}

تعقيد: O (ن)

يتحقق هذا من فهم الاجتياز الخطي والتحقق من الشروط.


39) كيف يمكنك إزالة جميع حالات ظهور مفتاح معين من قائمة مرتبطة؟

الخوارزمية:

  1. قم بمعالجة العقد الرئيسية أولاً إذا كانت تحتوي على المفتاح المستهدف.
  2. ثم قم باجتياز وحذف العقد اللاحقة التي تحتوي على المفتاح.

على سبيل المثال:

Input: 1 → 2 → 6 → 3 → 4 → 5 → 6, Key = 6  
Output: 1 → 2 → 3 → 4 → 5

تعقيد: O (ن)

وهذا يدل على معرفة الحالات الشاذة (وخاصة حذف الرؤوس).


40) ما هي الاختلافات الرئيسية بين هياكل البيانات المكدسة والقائمة المرتبطة؟

الميزات كومة قائمة مرتبطة
نوع الوصول LIFO (أخيرًا ، صادر أولاً) تسلسلي
تطبيق مصفوفة أو قائمة مرتبطة على أساس العقدة
العمليات ادفع/اضغط إدراج/حذف/استعراض
المرونة تقييد الوصول الوصول المرن
الحلول المقترحة إدارة استدعاءات الوظائف التعامل الديناميكي مع البيانات

يمكن تنفيذ المكدس باستخدام قائمة مرتبطة، لكنهما يختلفان في المفهوم - فالمكدس له وصول محدود بينما القائمة المرتبطة هي بنية ذات أغراض عامة.


🔍 أهم أسئلة المقابلات الشخصية مع سيناريوهات واقعية وردود استراتيجية

1) ما هي القائمة المرتبطة، وكيف تختلف عن المصفوفة؟

المتوقع من المرشح: يريد القائم بالمقابلة تقييم فهمك لهياكل البيانات الأساسية وقدرتك على مقارنة المفاضلات.

مثال للإجابة: القائمة المتصلة هي بنية بيانات خطية، حيث ترتبط العناصر، التي تُسمى العُقد، باستخدام المؤشرات. تحتوي كل عقدة على بيانات ومرجع إلى العقدة التالية. على عكس المصفوفات، لا تتطلب القوائم المتصلة ذاكرة متجاورة وتسمح بتغيير حجمها ديناميكيًا، ولكن أوقات الوصول إليها أبطأ لأن العناصر غير مفهرسة.


2) متى ستختار القائمة المرتبطة بدلاً من المصفوفة في تطبيق واقعي؟

المتوقع من المرشح: إنهم يقيمون حكمك العملي في اختيار هياكل البيانات المناسبة.

مثال للإجابة: أفضّل استخدام القوائم المتصلة عند الحاجة إلى عمليات إدراج وحذف متكررة، خاصةً في منتصف مجموعة البيانات. في وظيفتي السابقة، عملتُ على ميزة جدولة المهام حيث كانت المهام تُضاف وتُحذف بشكل متكرر، وقد أظهرت القوائم المتصلة أداءً أفضل من المصفوفات.


3) هل يمكنك شرح الفرق بين القوائم المرتبطة بشكل فردي والقوائم المرتبطة بشكل مزدوج؟

المتوقع من المرشح: يريد القائم بالمقابلة التحقق من وضوح مفاهيمك وقدرتك على شرح الاختلافات التقنية بوضوح.

مثال للإجابة: تحتوي القائمة المرتبطة أحادية الاتجاه على عقد تشير فقط إلى العقدة التالية، بينما تحتوي القائمة المرتبطة ثنائية الاتجاه على عقد تشير إلى كل من العقدة التالية والسابقة. تُسهّل القوائم المرتبطة ثنائية الاتجاه عملية التصفح العكسي، ولكنها تتطلب ذاكرة أكبر نظرًا لوجود مؤشر إضافي.


4) كيف يمكنك اكتشاف دورة في قائمة مرتبطة؟

المتوقع من المرشح: يختبر هذا مهاراتك في حل المشكلات ومدى إلمامك بالأنماط الخوارزمية الشائعة.

مثال للإجابة: تتمثل إحدى الطرق الشائعة في استخدام مؤشرين يتحركان بسرعتين مختلفتين، وهو ما يُعرف غالبًا بتقنية المؤشر البطيء والسريع. في حال وجود حلقة تكرارية، سيلتقي المؤشران في النهاية. في مقال سابق، استخدمتُ هذه الطريقة لمنع الحلقات اللانهائية في مسار معالجة البيانات.


5) ما هي بعض العمليات الشائعة التي يتم إجراؤها على القوائم المرتبطة؟

المتوقع من المرشح: يريد القائم بالمقابلة أن يتأكد من فهمك للعمليات القياسية وآثارها.

مثال للإجابة: تشمل العمليات الشائعة الإضافة والحذف والتنقل والبحث وعكس القائمة. ولكل عملية تعقيد زمني مختلف تبعًا لمكان تنفيذها، وهو أمر مهم عند تصميم أنظمة فعالة.


6) كيف تتعامل مع إدراج عقدة في منتصف قائمة مرتبطة؟

المتوقع من المرشح: إنهم يتحققون من فهمك لكيفية التعامل مع المؤشرات ومدى انتباهك للتفاصيل.

مثال للإجابة: لإدراج عقدة في المنتصف، أقوم أولاً باجتياز القائمة للعثور على الموضع المستهدف، ثم أضبط المؤشرات بحيث تشير العقدة الجديدة إلى العقدة التالية وتشير العقدة السابقة إلى العقدة الجديدة. يُعدّ تحديث المؤشرات بدقة أمرًا بالغ الأهمية لتجنب إتلاف القائمة.


7) صف موقفًا تسببت فيه قائمة مرتبطة في مشاكل في الأداء وكيف قمت بمعالجتها.

المتوقع من المرشح: يقيس هذا السؤال السلوكي قدرتك على التفكير والتحسين.

مثال للإجابة: في وظيفتي السابقة، كنا نستخدم قائمة مرتبطة لإجراء عمليات البحث المتكررة، مما أدى إلى بطء الأداء. قمت بتحديد المشكلة واقترحت التحول إلى بنية قائمة على التجزئة، مما أدى إلى تحسين أوقات البحث بشكل ملحوظ.


8) كيف يمكنك عكس قائمة مرتبطة؟

المتوقع من المرشح: يقوم القائم بالمقابلة باختبار تفكيرك المنطقي وفهمك للأساليب التكرارية أو المتكررة.

مثال للإجابة: أقوم بعكس ترتيب عناصر القائمة المتصلة من خلال المرور عليها وتغيير مؤشر "التالي" لكل عقدة ليشير إلى العقدة السابقة. تستمر هذه العملية حتى يتم عكس جميع المؤشرات وتحديث رأس القائمة.


9) ما هي مزايا وعيوب استخدام القوائم المرتبطة؟

المتوقع من المرشح: إنهم يريدون منظوراً متوازناً وإدراكاً للمفاضلات.

مثال للإجابة: تشمل المزايا الحجم الديناميكي وسهولة عمليات الإضافة والحذف. أما العيوب فتتمثل في استهلاك أكبر للذاكرة وبطء الوصول مقارنةً بالمصفوفات. في وظيفتي السابقة، ساعدني فهم هذه المفاضلات في اختيار البنية المناسبة لمختلف المكونات.


10) كيف تحدد نوع القائمة المرتبطة التي ستستخدمها في تصميم النظام؟

المتوقع من المرشح: يقيّم هذا السؤال الظرفي عملية صنع القرار في السياقات المعمارية.

مثال للإجابة: أضع في اعتباري عوامل مثل احتياجات التصفح، وقيود الذاكرة، وتكرار العمليات. على سبيل المثال، إذا كان التصفح العكسي مطلوبًا، فإن القائمة المرتبطة المزدوجة تكون أكثر ملاءمة، بينما تكفي القائمة المرتبطة المفردة للتطبيقات الأبسط والأكثر كفاءة في استخدام الذاكرة.

تلخيص هذه التدوينة بـ: