LintCode 鍊錶插入排序

2021-07-29 15:39:50 字數 1568 閱讀 5291

1.描述

用插入排序對鍊錶排序

樣例 given1->3->2->0->null, return0->1->2->3->null

2.分析

插入排序是十分常見的排序方式之一,類似於陣列的插入排序,此題是關於鍊錶的插入排序。

原題給定乙個以head為頭節點的鍊錶,下面再新建乙個有序的dummy鍊錶,通過把head鍊錶

中的節點分別插入到dummy鍊錶中完成對head鍊錶的排序。思路為在有序鍊錶中依次向下查詢

和原煉表中的值比較,當有序鍊錶的值比原鍊錶的值大時,把該值插入到有序鍊錶中。舉個例子如

有序鍊錶中有1、3,原煉表中為2。1和2先做比較,1小於2,繼續向下查詢,3比2大,此時把原鍊錶

中的2插入到1、3之間最終得到有序鍊錶1、2、3。

在有序鍊錶中依次向下查詢通過node=node->next完成指標向後移,之後的具體分析我在重要**

後面都加了注釋。下面的dummy鍊錶為新建的有序鍊錶,head鍊錶為原鍊錶。為了能夠返回有序鍊錶,

dummy鍊錶的頭節點dummy我沒有動,而另外定義了乙個node指標,而head鍊錶中不需要返回原鍊錶,

故直接用head作為指標依次往下移動(若還想要返回head指標需把頭節點儲存下來),node指標為

dummy煉表裡不斷向下移動的指標,head指標為head煉表裡不斷向下移動的指標。

3.**

/*** definition of listnode

* class listnode

* }*/

class solution

listnode *temp=head->next;/*以head為原煉表裡的指標依次向下查詢,跳出while迴圈時

查到的這個head比node.next大*/

head->next=node->next;//把head插入node.next前

node->next=head;//把head插入到node後,完成head插入到node和node.next之間

head=temp;//原head.next成為新的head繼續迴圈查詢

}return dummy->next;}};

4.總結

在對鍊錶做操作時有乙個很大的特點,就是head->next的變化一定要最後做。因為給定head節點時

head->next隨機確定下來,head->next就是下乙個節點,然而如果過早改變這個節點就找不到了,如

紅字部分**也是先把head->next存到temp中,之後做過一系列操作後head->next的位址已經改變,

但temp把原來head的下乙個節點保留了下來。

同時,單鏈表是有next支撐的,當插入新元素時,如把2插入到1和3之中,原有的關係是1->next=3;

插入後變為1->next=2,2->next=3,是斬斷之前兩個節點之間關係的基礎上建立新的兩個關係。

LintCode 鍊錶插入排序

用插入排序對鍊錶排序 樣例 given 1 3 2 0 null,return 0 1 2 3 null 解題思路 用temp移動,指向head指向的下乙個結點。用while迴圈判斷指標指向的下乙個位址不為空,如果新建的鍊錶指向的結點的值小於原鍊錶指向的結點的值,就向下移動,head指向的結點斷鏈,...

lintcode練習 173 鍊錶插入排序

用插入排序對鍊錶排序 given1 3 2 0 null,return0 1 2 3 null 實現 definition of listnode class listnode object def init self,val,next none self.val val self.next nex...

鍊錶插入排序

void insertsort list sortascount,node node else p prior next q q next p int sortwithinsetmethod list sortasdata wchar pp p data if isnum pp int i 0 i ...