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

الخصائص الرئيسية لـ LinkedList في جافا:

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

أنواع LinkedList:

هناك عدة أنواع من LinkedList، منها:

  • قائمة مرتبطة مفردة (Singly LinkedList): تحتوي كل عقدة على بيانات ومؤشر إلى العقدة التالية فقط.
  • قائمة مرتبطة مزدوجة (Doubly LinkedList): تحتوي كل عقدة على بيانات ومؤشرين، أحدهما إلى العقدة التالية والآخر إلى العقدة السابقة. هذا يسمح بالاجتياز في كلا الاتجاهين.
  • قائمة مرتبطة دائرية (Circular LinkedList): يشير مؤشر العقدة الأخيرة إلى العقدة الأولى، مما يشكل حلقة.

الاستخدامات الشائعة لـ LinkedList:

  • تنفيذ الطوابير والمكدسات: يمكن استخدام LinkedList لتنفيذ هياكل بيانات الطابور (Queue) والمكدس (Stack).
  • إدارة قائمة من العناصر المتغيرة: عندما يكون من المتوقع إضافة وحذف العناصر بشكل متكرر.
  • تطبيقات التخزين المؤقت (Caching): يمكن استخدام LinkedList لتنفيذ سياسات الإخلاء مثل LRU (Least Recently Used).

مثال بسيط في جافا:

Java
import java.util.LinkedList;

public class LinkedListExample {
public static void main(String[] args) {
LinkedList<String> names = new LinkedList<>();

names.add("Firas");
names.add("Bob");
names.add("Charlie");

System.out.println(names); // Output: [Alice, Bob, Charlie]

names.add(1, "David"); // Insert "David" at index 1
System.out.println(names); // Output: [Alice, David, Bob, Charlie]

names.remove("Bob");
System.out.println(names); // Output: [Alice, David, Charlie]
}
}

في هذا المثال، نُنشئ LinkedList لتخزين أسماء، ثم نضيف عناصر ونُجري عمليات إدخال وحذف.

باختصار، LinkedList هي هيكل بيانات مرن وفعال لبعض العمليات، ولكن يجب مراعاة عدم كفاءتها في الوصول العشوائي عند اختيارها.