問題描述:
對鏈表進行插入排序:
【1】插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
【2】每次迭代中,插入排序只從輸入數據中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
【3】重複直到所有輸入數據插入完爲止。
問題分析:
本題考察的是插入排序,只是其基本的數據結構爲:鏈表!!我們非常熟悉數組類型的數據,但是這種帶指針類型的數據存在一些理解上的誤區!其實這種鏈表結構類型的數據可以大大節省空間,而且可以保證數據的順序存儲。
下面給出插入排序的一般解題思路:
【1】將數據分爲兩部分,一是已經排序的數組,二是未排序的數組。
【2】每次從未排序的數組中選取一個元素,然後進行刪除處理;
【3】在已排序的數組中進行插入;
【4】重複【2、3】步驟,直到未排序的數組清空爲止。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
if(head==nullptr||head->next==nullptr) return head;
ListNode* dummy = new ListNode(-1); //創建啞節點
dummy ->next = head;
ListNode* prev = head;
ListNode* node = head->next;
while(node)
{
if((node->val)<(prev->val) ) //如果後一個節點比前一個節點值小,要交換
{
ListNode *tmp = dummy;
while(tmp->next->val < node->val)
{
tmp =tmp->next;
}
prev->next = node->next;
node->next = tmp->next;
tmp->next = node;
node = prev->next;
}
else {
prev = prev->next;
node = node->next;
}
}
return dummy->next;
}
};