一、题目介绍
对链表进行插入排序。
插入排序算法:
(1)插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
(2)每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
(3)重复直到所有输入数据插入完为止。
二、解题思路
因为题目给的链表结构为单链表,所以进行插入的时候没办法从后向前遍历,因此当检测到当前节点的值大于前一节点时,就从前向后遍历找到第一个小于当前节点的节点,再执行插入。在插入的过程中需要处理好如下关系:
(1)当前节点pNode的前一节点preNode指向其后一节点,即preNode->next = pNode->next。
(2)当前节点指向被插入节点pTemp,即pNode->next = pTemp。
(3)被插入节点的前一节点p不为空的前提下,指向当前节点,p->next = pNode;
(4)如果被插入节点为头结点head,插入完成之后,需要更新头结点。
三、解题代码
/**
* 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 == NULL)
return head;
ListNode* pNode = head;
ListNode* preNode = NULL;
while(pNode)
{
if(preNode && pNode->val < preNode->val)
{
ListNode* pTemp = head;
ListNode* p = NULL;
while(pTemp != pNode)
{
if(pTemp->val > pNode->val)
{
preNode->next = pNode->next; //前一个节点指向后一个节点
pNode->next = pTemp;//移动的节点指向被插入的节点
if(p)//被插入节点的前一个节点指向插入的节点
p->next = pNode;
if(pTemp == head) //更新头结点
head = pNode;
pNode = preNode;
break;
}
p = pTemp;
pTemp = pTemp->next;
}
}
preNode = pNode;
pNode = pNode->next;
}
return head;
}
};