設計在單鏈表中刪除值相同的多餘結點的算法

這是一道算法題,寫算法題最恨沒有圖解,懂的人不須要看你的文章,不懂的你再怎麼講解也沒有幾張圖解來得簡單易懂,下面來分析一下這道題。web

我暫時尚未更好的解決方案,雖然有一個辦法解決,可是時間複雜度有點高,先看看個人思路吧。算法

在這裏插入圖片描述

這是一個無序的單鏈表,咱們採用一種最笨的辦法,先指向首元結點,其元素值爲2,再遍歷該結點後的全部結點,如有結點元素值與其相同,則刪除;所有遍歷完成後,咱們再指向第二個結點,再進行一樣的操做。


看圖解:
微信

在這裏插入圖片描述

這裏有兩個指針變量p、q,均指向單鏈表的首元結點,咱們先不移動指針p,而是讓指針q去遍歷以後的全部結點。


在這裏插入圖片描述

先讓指針p指向的結點與後一個結點比較,這裏爲了操做方便,咱們暫且先不移動指針q,而是這樣進行比較: p -> data == q -> next -> data;若不相等,則讓q指向下一個結點: p = p->next;若相等,則應該先保存下一個結點: r = q -> next,而後讓q指針指向下一個結點的下一個結點: q = r -> next,並釋放r指向的結點內存。


這樣就成功刪除了一個與首元結點重複的結點,接下來以一樣的方式繼續比較,直到整個單鏈表都遍歷完畢,此時單鏈表中已無與首元結點重複的結點;而後咱們就要修改p指針的指向,讓其指向首元結點的下一個結點,再讓q指向其下一個結點,繼續遍歷,將單鏈表中與第二個結點重複的全部結點刪除。以此類推,直至指針p也遍歷完了整個單鏈表,則算法結束。spa

剛纔咱們已經刪除了一個結點,那麼接下來p應該指向下一個結點了:
.net

在這裏插入圖片描述

此時讓指針p指向的結點與下一個結點的元素值比較,發現不相等,那麼讓q直接指向下一個結點便可: q = q -> next
在這裏插入圖片描述

繼續讓q指向的結點的下一個結點與p指向的結點的元素值比較,發現不相等,此時繼續移動q,移動事後q的指針域爲NULL,說明遍歷結束,此時應該移動指針p。
在這裏插入圖片描述

經過比較發現,下一個結點的元素值與其相等,接下來就刪除下一個結點便可:
在這裏插入圖片描述

此時p的指針域也爲NULL,算法結束。


代碼以下:指針

LinkList DeleteRepeat(LinkList l){
    LinkList p,q,r;
    p = l->next;
    while(p != NULL){
        q = p;
        while(q->next != NULL){
            if(p->data == q->next->data){
                r = q->next;
                q = r->next;
                free(r);    
            }else{
                q = q->next;
            }
        }
        p = p->next;
    }
    return l;
}

微信搜索【碼視界】或者掃描下方二維碼關注個人微信公衆號,更多精彩等着你!code


本文分享自微信公衆號 - 碼視界(otc_18679428729)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。orm

相關文章
相關標籤/搜索