1. 程式人生 > >知識點13:手寫程式碼-倒轉連結串列的c語言實現

知識點13:手寫程式碼-倒轉連結串列的c語言實現

寫在前面的廢話:筆記本壞掉了,一插入8g的記憶體卡就開不了機,而不插入的話可以開機,但是又啟動不了AS。不知道是記憶體卡的問題還是電腦介面的問題,想哭。這段時間要等同學帶他的電腦過來幫我測試,所以關於Android的內容暫時是寫不了的了~
然後,秋招火爆到來,這段時間除了一邊繼續學習嵌入式外,其他的莫過於準備秋招了。資料結構和演算法是我的弱點中的弱點,所以需要加強,所以遇上一些常見的演算法題的時候,還是會試著去寫,然後貼出來的,算是積累體驗吧。今天的是倒轉連結串列的實現

倒轉連結串列的思路

關於倒轉連結串列的實現,一般的問題形式是從尾到頭列印連結串列中的資料,這樣的話其實會有兩種情形,分別是列印資料而不改變連結串列結構,就比如你只需要用陣列依次儲存連結串列資料,再方向列印。或者遞迴遍歷連結串列列印資料即可,這個比較簡單,容易實現。而另外一種則是需要真正的反轉連結串列每個節點的指向方向,徹底改變結構再依次列印,技術要求是比較大的。所以如果被問到這個問題時,需要先和麵試官溝通好,用哪種形式。下面是第二種形式的思路:
遞迴思想。迴圈遍歷連結串列,分別用兩個指標p和q記錄兩個相鄰的節點,如果q處於尾節點的時候,則使其指向前面的q,並將q指標的next指標設為NULL。然後遞迴上面操作,直到連結串列頭指標的指向為NULL的時候,從新設定連結串列的頭指標指向尾節點。從而完成反轉。出現的一個問題是不知道如何在遞迴中預先儲存尾節點。解決思路是首先通過方法得到連結串列的尾節點,作為倒轉方法的引數傳遞過去。實現如下:

倒轉連結串列的實現

/*獲得連結串列的尾節點地址*/
Node *get_tail_node(Linked *linked){
        Node *p=linked->head;
        while(p->next!=NULL){
            p = p->next;
        }
        return p;
};
/*倒轉連結串列方法
 linked:需要倒轉的指標
 head:儲存的尾節點地址,由get_tail_node()方法傳入
*/
void reverse(Linked *linked,Node *head){
    //當頭指標的指向為NULL時,代表連結串列倒轉成功
if(linked->head->next==NULL){ linked->head = head; return; } //p,q表示相鄰的兩個連結串列節點 Node *p=linked->head; Node *q=p->next; //q跳轉到尾節點,p為尾節點的前驅 while(q->next!=NULL){ p=p->next; q=p->next; } //倒轉連結串列指向 q->next=p; p->next=NULL
; //遞迴以上操作 reverse(linked,head); }