17-05-2007, 22:25
|
|
|
|
חבר מתאריך: 12.03.03
הודעות: 2,176
|
|
הנה עוד דרך.
קודם כל הסבר אח"כ מימוש.
הפונקציה תקבל שני פרמטרים, מצביע לראש הרשימה ומצביע לאיבר הנוכחי. הרעיון הוא פשוט, תמיד להעביר את האיבר הנוכחי לראש הרשימה, לגרום לו להצביע לאיבר שלפני כן היה ראש הרשימה ואז לקרוא לפונקציה שוב אחרי שקידמנו את האיבר הנוכחי באחד (כמובן שנפסיק כאשר אין לאן לקדם את האיבר הנוכחי). עוד נקודה אחת, הכל טוב ויפה אך אם בקריאה הראשונה נקבל בפרמטר של האיבר הנוכחי מצביע לאיבר שהוא ראש הרשימה אז ניצור לולאה ברשימה כיוון שהאיבר הראשון (שבסופו של דבר יהיה בסוף הרשימה) יצביע לעצמו.
קוד PHP:
void reverse_list(link **head, link *cur) {
link *tmp = NULL;
if (head == NULL || *head == NULL || cur == NULL) return; // On the first itteration we don't need to swap the current link with the head // since they are the same link. But we want to set this link to be last on the // list so we set the next member to point to NULL. if (*head == cur) { cur = cur->next; (*head)->next = NULL; reverse_list(head, cur); return; }
// For any link that is not the orignal head do the next: // * Set the current link to be the head. // * Advance the current link by one. // * Set the head's next link to be the previous head. // * Call the function again to complete the reversion. tmp = *head; *head = cur; cur = cur->next; (*head)->next = tmp; reverse_list(head, cur); }
|