翻轉連結串列的方法
阿新 • • 發佈:2018-11-26
前兩天看到一個題目,將連結串列反轉,我的第一思路是將列表放入棧中,然後再依次拿出來。
思想過於簡單,我想到說利用陣列來實現這個功能。之後檢視網上各種大神的方法,做以下幾個方法總結。
一、放入陣列,陣列倒置
void reverse(pnode head, int count)//把連結串列的節點值放在陣列中,倒置陣列 { int a[5]= {0}; for(int i=0; i<count,head->pnext!=NULL; i++) { a[i]=head->pnext->data; head=head->pnext; }for(int j=0,i=count-1; j<count; j++,i--) printf("%d\t",a[i]); }
二、遍歷到連結串列的最後一個節點,將最後一個節點插入頭節點的後面,接著迴圈進行插入,直到只剩下一個節點為止
void ReserveList(pListNode pHead) { pListNode p = pHead; pListNode pPre = pHead; pListNode pTail = pHead->next; while (p->next->next != NULL) {while (pTail->next) { pPre = pTail; pTail = pTail->next; } pPre->next = NULL; pTail->next = p->next; p->next = pTail; p = pTail; } }
三、首先定義三個指分別 Pre(表示當前指標的前驅初值為NULL),pCur(當前節點指標),pNext(當前節點的下一個指標),每當當前指標不為空時就會把當前指標指向前驅指標,直到當前指標為空。
void ReserveList(pListNode pHead) { pListNode pre = NULL; pListNode pNext = NULL; pListNode pCur = pHead->next; while (pCur) { pNext = pCur->next; pCur->next = pre; pre = pCur; pCur = pNext; } pHead->next = pre; }
四、遞迴:當求全部連結串列的翻轉時,只要把除當前指標外後面的指標翻轉,然後再把當前指標放在翻轉後的指標後面就行了,即把連結串列從更大範圍翻轉縮小更小範圍
pListNode ReserveList(pListNode p, pListNode pStaticHead) { if (pStaticHead == NULL) { return NULL; } if (p->next == NULL) { pStaticHead->next = p; return p; } else { pListNode temp = ReserveList(p->next,pStaticHead); temp->next = p; p->next = NULL; return p; } }
參考:
https://blog.csdn.net/qq_36675830/article/details/78064488?readlog
https://blog.csdn.net/qq_36675830/article/details/78064488?readlog