מבני נתונים ואלגוריתמים - מחברת קורס/מבני נתונים/רשימות מקושרות/תרגילים/החלפת הסדר של רשימה מקושרת חד כוונית/תשובה
מראה
פסוודו-קוד והסבר
[עריכה]להלן הפסוודו-קוד לפתרון:
#Takes a singly-linked list (l) and reverses it.
Reverse(l)
1 new-front = Nil
2 while l.front != Nil
3 nxt = l.front.next
4 l.front.next = new-front
5 new-front = l.front
6 l.front = nxt
7 l.front = new-front
נתבונן ברשימה המקושרת בתרשים הבא.
- שורה 1 מייצרת מצביע
new-front
המצביע לNil
(A). מצביע זה יצביע לרשימות החוליות שכבר הפכו את סדרן. - כעת נעבור בלולאה 2-6, כל עוד נותרו איברים אליהם מצביע
l.front
. בכל איטרציה:- שורה 3 מייצרת מצביע
nxt
המצביע לl.front.next
(B). - שורה 4 גורמת ל
l.front.next
להצביע לרשימת החוליות שאליה מצביעnew-front
(C) (בתחילה זו רשימת חוליות ריקה, כמובן). - שורה 5 גורמת ל
new-front
להצביע לl.front
(D) - שורה 6 מקדמת את
l.front
לחוליה הבאה (E). - כלומר, כל איטרציה מעבירה חוליה מתחילת הרשימה לראש רשימת חוליות אליה מצביע
new-front
. (F) מראה זאת בצורה ברורה יותר עבור האיטרציה הראשונה.
- שורה 3 מייצרת מצביע
- לאחר סיום הלולאה, שורה 7 עושה את כל מה שנותר: לגרום ל
l.front
להצביע לחוליה הראשונה בnew-front
.
ניתוח סיבוכיות וזיכרון
[עריכה]קל לראות שהסיבוכיות היא :
- 1 ו7 הן .
- 3-6 הן ולכן 2-6 (כי ברור שהלולאה מתבצעת פעמים).
כמו כן השתמשנו בכמות מוגבלת של זכרון (השתמשנו בשני משתני עזר בלבד).