1. 程式人生 > 實用技巧 >C語言連結串列逆序問題(附圖解)

C語言連結串列逆序問題(附圖解)

引用: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 }