因為鍊錶不能像陣列一樣用下標訪問,而只能用next訪問,所以我們只能用next做文章了。
考慮下面兩種方案:
1.從前往後遍歷交換。
2.從後往前遍歷交換
對於方案1,比如我們要對2, 3,1, 4做乙個公升序,當我們遍歷到1時,可以交換1和3,交換後順序為2,1,3,4,但因為沒有乙個向前的指標,導致我們無法完成2和1的交換,除非我們從頭開始做第二次遍歷才能完成2和1的交換,這顯然就太複雜了。這樣來看,每個數最多只能向前移動一步,這樣就很麻煩,。
對於方案2,我們可以通過遞迴至最後乙個節點,然後往前,考慮2,1,6,3,5,4,遍歷到4時返回,此時head指向5,交換4和5,交換後的順序為2,1,6,3,4,5,這步肯定沒問題。當我們遍歷到6這個節點時,交換6和3,但因為6最大,肯定 還需要往後面移動,這裡利用whlie迴圈,而且可以通過next遍歷比較至最後。
總的來說,因為鍊錶的限制,我們只能用next指標。而通過遞迴,在將後面節點排序好之後,我們是可以返回前乙個節點的,這樣我們就可以將某個節點只與後面的比較,而不用與前面的比較了,這就是通過從後往前遍歷實現的。
static
void
list_sort
(struct node *head)
//遞迴呼叫
}
氣泡排序(鍊錶實現)
暑假裡看到大神的一篇文章,在乙個大公司裡面試,面試氣泡排序鍊錶版,當時想了寫一下,不知該如何寫起,就放下了,最近資料結構又重新學習鍊錶,試著寫了下,對鍊錶的操作熟練運用吧。調的我很糾結啊。1 include 2 include 3 include 4 include 5 using namespac...
用鍊錶實現氣泡排序!
我們需要把資料儲存在鍊錶中,然後呼叫排序函式就可以了。但必須要注意鍊錶與陣列的不同點,鍊錶沒有下標,要想訪問資料域必須通過節點來訪問。二 實現 include includetypedef int elemtype typedef struct node node,plist void init p...
鍊錶氣泡排序
2011 07 22 21 33 111人閱讀收藏 舉報 任意兩個相鄰節點p q位置互換圖示 假設p1 next指向p,那麼顯然p1 next next就指向q,p1 next next next就指向q的後繼節點,我們用p2儲存 p1 next next指標。即 p2 p1 next next,則...