去面試被問到一個問題,怎么把一個鏈表反轉(用原鏈表),自己在網上找了到了一篇文章,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 }