الحلقات المتسلسلة أحادية الاتجاه 2

السلام عليكم

هل الجميع هنا؟
هل من أحد ناقص؟
نادوا الجميع فلست أحب أن أعيد ما أقول
تعلمون أن الملل شيء أساسي في حياتي
العدد اكتمل جيد فلنبدأ إذاً
في المرة السابقة تحدثنا عن الحلقات المتسلسلة أحادية الاتجاه
أظن ذلك ظاهر في العنوان
نبدأ بإصلاح المشكلة التي كانت تحتويها الشيفرة القديمة
المشكلة كانت تكمن في الإضافة إلى نهاية سلسلة فارغة(لا تحتوي أي عناصر)
كل ما هنالك أن الجملة التالية ستعطي خطأ NullPointerException

[pre]
head.geteNext();
[/pre]
في حال إذا استخدمنا الدالة addLast والسلسلة فارغة
لذلك نجري التعديل التالي
[pre]
if(head==null){
addFirst(element);
return;
}
[/pre]
وقد انتهينا من مشاكلنا القديمة
تعالوا نفكر كيف نحسن من التركيب الخاص بنا
نريد أن نضيف عنصر في آخر السلسلة
الدالة إضافة في النهاية أصبحت تقوم بذلك بشكل جيد
لكن ماذا لو كان لدينا عدد كبير من العناصر
نلاحظ أننا سنأخذ وقتاً طويلاً حتى نصل إلى نهاية السلسلة ونضيف العنصر الجديد
مع أننا لن نستفيد شيئاً بالمرور على كل العناصر
لذا يجب أن نجد حلاً آخر
خذوا عندكم السؤال التالي
لماذا لا نعاني في إضافة عنصر أول السلسلة؟
الجواب لأننا نملك المتغير head والذي يشير إلى أول السلسلة
جيد
لماذا لا نقوم بتخزين العنصر الأخير في متغير ولنسمه tail؟
الآن نستطيع الإمساك بنهاية السلسلة
وبالتالي إضافة أي عنصر في النهاية دون أية متاعب
الشيفرة التالية توضح ذلك
[pre]
public void addLast(Object element){
SNode newNode=new SNode(element,null);
if(head==null){
head=newNode;
tail=newNode;
}
else if(tail==null){
tail=newNode;
head.setNext(tail);
}
else{
tail.setNext(newNode);
tail=newNode;
}
}
[/pre]

بالطبع لن ننسى تغيير الدوال التي بنيناها سابقاً لكي تتوافق مع tail
لقد قمنا بعمل جيد حتى الآن
الآن نريد أن نحذف العنصر الأخير في السلسلة
هل نستطيع الاسفتادة من المتغير tail في ذلك
بالتأكيد لأ
لأنه لا طريق بين tail والعنصر الذي قبله
عدنا لنفس النقطة الأصلية
سنضطر إلى المرور على كل الحلقات حتى نصل إلى نهاية السلسلة
الشيفرة التالية توضح الطريقة
[pre]
public Object deleteLast(){
SNode temp=head;
if(tail==head){
head=null;
tail=null;
return temp.getElement();
}
while(temp.getNext()!=tail)
temp=temp.getNext();
Object objtemp=tail.getElement();
tail=temp;
tail.setNext(null);
return objtemp;
}
[/pre]
الآن نلاحظ أن الشيفرة الخاصة بنا أصبحت مصيبة بمعنى الكلمة
سنحاول في المرة القادمة إلباسها حلة جيدة
لكي يتسنى لنا الإضافة عليها

تحياتي
م.علاء

Leave a Reply