طباعة قائمة متصلة فردية
هذه هي القائمة المتصلة كما ذكرناها في هذا الفصل التكرار و الحزمة:
let list = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
إكتب دالة printList(list)
التي تقوم بطباعة القائمة واحداً تلو الأخر.
قم بحلها بطريقتين:
- مرة بإستخدام الحلقة:
- مرة بإستخدام التكرار:
ماهو الأفضل: بالتكرار أم بدون التكرار؟
حل مبني علي الحلقة
الحل:
let list = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
function printList(list) {
let tmp = list;
while (tmp) {
alert(tmp.value);
tmp = tmp.next;
}
}
printList(list);
يرجي ملاحظة أننا نستخدم المتغير المؤقت tmp
للمرور خلال القائمة. من الناحية الفنية, يمكن أن نستخدم عامل الدالة list
:
function printList(list) {
while(list) {
alert(list.value);
list = list.next;
}
}
لكن هذا لن يكون محبذاً في المستقبل لأنه بسبب ما من الممكن أن نمد الدالة لفعل شئ أخر للقائمة.
لو غيرنا الـ list
سنخسر هذه الميزة.
بمناسبة الحديث عن التسمية الجيدة للمتغيرات, list
تعتبر الـ القائمة نفسها. بمعني أدق العنصر الأول فيها. وهو يجب أن يبقي هكذا.
علي صعيد أخر, دور tmp
يهتم فقط بالانتقال بين عناصر القائمة, مثل i
الموجود في حلقة for
From the other side, the role of tmp
is exclusively a list traversal, like i
in the for
loop.
الحل التكراري
الحل التكراري للدالة printList(list)
يتبع منطق بسيط لطباعة القائمة: يجب طباعة العنصر الحالي list
ثم إعادة الموضوع للباقي list.next
حتي تنتهي القائمة :
let list = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
function printList(list) {
alert(list.value); // output the current item
if (list.next) {
printList(list.next); // do the same for the rest of the list
}
}
printList(list);
الأن من هو الأفضل؟
عملياً الحلقة أكثر كفاءة بالرغم من أنهم يقومون بنفس المهمة, لكن الحلقة لا تستطيع عمل أكثر من نداء متداخل.
علي الجانب الأخر التكرار يعتبر أسهل للفهم وأقصر