C語言連結串列逆序問題(附圖解)
阿新 • • 發佈:2020-10-20
引用:https://www.cnblogs.com/kingos/p/4498224.html
方法一:將連結串列資料全部讀到陣列中,然後在倒序輸出。
方法二:從第二個結點開始,記錄它的下個結點,把它挪到第一個結點之前,成為新表頭,然後下個結點繼續這個過程。
方法三:從第二個結點開始,把之後的每個結點都插入到第一個結點之後,最後在把第一個結點挪到表尾。
第二種方法:
1 struct stu *reserve(struct stu *head) 2 { 3 struct stu *p1,*p2,*p3; 4 p1=head; 5 p2=p1->next; //這個結點為要移動的結點 6 while(p2) 7 { 8 p3=p2->next; //記錄的為要移動的結點的下一個結點 9 p2->next=p1; //移動結點到最前 10 p1=p2; //移動的結點變為新表頭 11 p2=p3; //下個結點變為要移動的結點 12 } 13 head->next=NULL; //移動完畢後head變為表尾,讓它指向為空14 head=p1; 15 return head; 16 }
方法三的貼下原作者的程式碼加上自己的思路:
1 struct stu *reserve(struct stu *head) 2 { 3 struct stu *p,*q; 4 p=head->next; //記錄第二個結點 5 while(p->next!=NULL) 6 { 7 q=p->next; //記錄要移動的結點 8 p->next=q->next; //把該結點從原連結串列中移除 9 q->next=head->next; //把該結點連線到head之後 10 head->next=q; 11 } 12 p->next=head; //把head移動到新表尾,此時連結串列成環 13 head=p->next->next; //找到移動完之後的新head 14 p->next->next=NULL; //斷開環 15 return head; 16 17 }