c語言鏈表逆序的問題


去面試被問到一個問題,怎么把一個鏈表反轉(用原鏈表),自己在網上找了到了一篇文章,http://blog.csdn.net/sicofield/article/details/8850269,原作者給出了三種方法,

方法一:將鏈表數據全部讀到數組中,然后在倒序輸出。

方法二:就是我下面要講的。

方法三:從第二個結點開始,把之后的每個結點都插入到第一個結點之后,最后在把第一個結點挪到表尾。

第二種方法的思路是:從第二個結點開始,記錄它的下個結點,把它挪到第一個結點之前,成為新表頭,然后下個結點繼續這個過程。

 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 }



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM