單鏈表的逆轉

昨天看CSDN的一個文章提到,某公司面試時問到單向鏈表的反轉問題,有好多程序員答不出來。以前我也沒做過類似的題目,試着寫了一下。

問題描述:已知一個單向鏈表,寫一個函數,使得該鏈表的方向反轉,即頭變尾,尾變頭,指示方向相反。

分析:該問題可以有兩種方法,一是交換首尾兩個節點的數據,而不改變其內存的存儲結構,二是改變所有節點的指向下一個節點的指針。顯然第二種方法更加有效。

  1. /×鏈表的定義和一些操作*/

  2. typedefstructlist

  3. {

  4. intno;

  5. structlist*pNext;

  6. }list;

  7. list*listinit(intcount)

  8. {

  9. list*pHead;

  10. list*pList;

  11. intno=0;

  12. pHead=malloc(sizeof(list));

  13. pHead->no=no;

  14. pList=pHead;

  15. while(count--)

  16. {

  17. pList->pNext=malloc(sizeof(list));

  18. pList=pList->pNext;

  19. pList->no=++no;

  20. }

  21. pList->pNext=NULL;

  22. returnpHead;

  23. }

  24. voidlistrelease(list*pHead)

  25. {

  26. list*pList=pHead;

  27. list*pNext;

  28. //free((char*)pHead);

  29. //return;

  30. while(pList!=NULL)

  31. {

  32. pNext=pList->pNext;

  33. free(pList);

  34. pList=pNext;

  35. }

  36. }

/×鏈表的定義和一些操作*/ typedef struct list { int no; struct list *pNext; }list; list *listinit(int count) { list *pHead; list *pList; int no=0; pHead=malloc(sizeof(list)); pHead->no=no; pList=pHead; while(count--) { pList->pNext=malloc(sizeof(list)); pList=pList->pNext; pList->no=++no; } pList->pNext=NULL; return pHead; } void listrelease(list *pHead) { list *pList=pHead; list *pNext; //free((char*)pHead); //return; while(pList!=NULL) { pNext=pList->pNext; free(pList); pList=pNext; } }

  1. /*鏈表反轉的算法,其實很簡單*/

  2. list*listreverse(list*pHead)

  3. {

  4. list*pList=pHead;

  5. list*paPre=NULL;

  6. list*paNext=NULL;

  7. do

  8. {

  9. paNext=pList->pNext;

  10. pList->pNext=paPre;

  11. paPre=pList;

  12. pList=paNext;

  13. }while(pList!=NULL);

  14. returnpaPre;

  15. }

  16. /*這是測試用的函數*/

  17. voidlistshow(list*pHead)

  18. {

  19. list*pList=pHead;

  20. while(pList!=NULL)

  21. {

  22. printf("list=%d/n",pList->no);

  23. pList=pList->pNext;

  24. }

  25. }

  26. intmain()

  27. {

  28. list*pHead=listinit(10);

  29. printf("beforereverse:/n");

  30. listshow(pHead);

  31. pHead=listreverse(pHead);

  32. printf("afterreverse:/n");

  33. listshow(pHead);

  34. listrelease(pHead);

  35. return0;

  36. }

/*鏈表反轉的算法,其實很簡單*/ list *listreverse(list *pHead) { list *pList=pHead; list *paPre=NULL; list *paNext=NULL; do { paNext=pList->pNext; pList->pNext=paPre; paPre=pList; pList=paNext; }while(pList!=NULL); return paPre; } /*這是測試用的函數*/ void listshow(list *pHead) { list *pList=pHead; while(pList!=NULL) { printf("list=%d/n",pList->no); pList=pList->pNext; } } int main() { list *pHead=listinit(10); printf("before reverse:/n"); listshow(pHead); pHead=listreverse(pHead); printf("after reverse:/n"); listshow(pHead); listrelease(pHead); return 0; }

運行結果:

beforereverse:

list=0

list=1

list=2

list=3

list=4

list=5

list=6

list=7

list=8

list=9

list=10

afterreverse:

list=10

list=9

list=8

list=7

list=6

list=5

list=4

list=3

list=2

list=1

list=0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章