إتقان هياكل البيانات

القوائم المترابطة والمكدسات والطوابير

4 دقيقة للقراءة

تختبر هياكل البيانات هذه قدرتك على العمل مع المؤشرات وفهم ترتيب LIFO/FIFO -- مهارات تظهر في العديد من مسائل المقابلات.

القوائم المترابطة (Linked Lists)

القائمة المترابطة تخزن العناصر في عُقد مرتبطة بمؤشرات. الاختلافات الرئيسية عن المصفوفات:

الخاصية المصفوفة القائمة المترابطة
الوصول بالفهرس O(1) O(n)
الإدراج في البداية O(n) O(1)
الإدراج في النهاية O(1)* O(n) أو O(1) مع مؤشر الذيل
الذاكرة متجاورة متفرقة
أداء الكاش أفضل أسوأ

أنماط القوائم المترابطة الأساسية:

# التعريف
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

# النمط 1: عكس القائمة المترابطة
def reverse_list(head):
    prev, curr = None, head
    while curr:
        next_node = curr.next
        curr.next = prev
        prev = curr
        curr = next_node
    return prev

# النمط 2: المؤشرات السريعة/البطيئة (كشف الدورات - Floyd)
def has_cycle(head):
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            return True
    return False

# النمط 3: إيجاد منتصف القائمة المترابطة
def find_middle(head):
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    return slow

نصيحة للمقابلات: تقنية المؤشر السريع/البطيء تحل العديد من مسائل القوائم المترابطة: كشف الدورات، إيجاد المنتصف، إيجاد العقدة رقم n من النهاية، وكشف نقاط التقاطع.

المكدسات (Stacks - LIFO)

المكدسات تتبع ترتيب الأخير يدخل أولاً يخرج. وهي أساسية لـ:

  • مطابقة الأقواس -- السؤال الكلاسيكي في المقابلات
  • المكدس الرتيب (Monotonic Stack) -- العنصر الأكبر/الأصغر التالي
  • تقييم التعبيرات -- التحويل بين الصيغ
  • اجتياز DFS -- DFS التكراري يستخدم مكدسًا
# أقواس صالحة (سؤال مقابلة كلاسيكي)
def is_valid_parentheses(s):
    stack = []
    mapping = {')': '(', '}': '{', ']': '['}
    for char in s:
        if char in mapping:
            if not stack or stack[-1] != mapping[char]:
                return False
            stack.pop()
        else:
            stack.append(char)
    return len(stack) == 0

# المكدس الرتيب: العنصر الأكبر التالي
def next_greater_element(nums):
    result = [-1] * len(nums)
    stack = []  # يخزّن الفهارس
    for i in range(len(nums)):
        while stack and nums[i] > nums[stack[-1]]:
            idx = stack.pop()
            result[idx] = nums[i]
        stack.append(i)
    return result

الطوابير (Queues - FIFO)

الطوابير تتبع ترتيب الأول يدخل أولاً يخرج. وهي أساسية لـ:

  • اجتياز BFS -- اجتياز الأشجار مستوى بمستوى، أقصر مسار
  • أقصى النافذة المنزلقة -- باستخدام deque (طابور ثنائي النهاية)
  • جدولة المهام -- ترتيب العمليات
from collections import deque

# اجتياز BFS مستوى بمستوى
def level_order(root):
    if not root:
        return []
    result = []
    queue = deque([root])
    while queue:
        level = []
        for _ in range(len(queue)):
            node = queue.popleft()
            level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        result.append(level)
    return result

متى تستخدم ماذا

نوع المسألة هيكل البيانات مثال
المطابقة/التداخل المكدس أقواس صالحة، وسوم HTML
الأكبر/الأصغر التالي المكدس الرتيب أسعار الأسهم، درجات الحرارة
المعالجة مستوى بمستوى الطابور BFS للأشجار، أقصر مسار
الترتيب العكسي المكدس عكس السلسلة، عمليات التراجع
كشف الدورات قائمة مترابطة + سريع/بطيء دورة القائمة، كشف الحلقات

التالي: سنستكشف الأشجار والرسوم البيانية -- أكثر هياكل البيانات تعقيدًا التي ستواجهها في المقابلات. :::

اختبار

اختبار الوحدة 2: إتقان هياكل البيانات

خذ الاختبار