一道在链表上进行插入排序的题目,假设在数组上,插入排序的写法不难,但是数据结构改为链表,还是有点儿麻烦的。首先看下题目:
Sort a linked list using insertion sort.
Algorithm of Insertion Sort:
对于链表进行插入排序,首先,我们得定位到head之后的节点,然后比较它之前的所有节点。当它比某个节点的值小的时候,插入到它前面。所以这里有一个交换的过程,逻辑主要在交换。
在交换节点的时候有几种情况需要处理,一种是要交换的节点为head节点,那么我们每次交换的时候必须也要更新head节点的值,另一种情况不是head节点,那么我们需要把小的节点插入到两个节点之间。
另外一个细节就是,我们需要维护一个当前需要进行插入排序的节点的前一个节点,假设每次都进行遍历进行查找,肯定会降低效率。所以我们在初始的时候,将tail节点设置为head,当下一个节点插入在它前面的节点之前的时候,我们不必更新tail的值,因为它还是作为下一个要进行插入排序元素的前一个元素;当不需要进行交换的时候,也就是当前节点比它之前所有的节点都大的时候,我们需要把tail节点取下一个节点作为tail,当然tail也就是当前节点。
除了这些细节,其它都比较好处理,贴一个自己的实现:
ListNode* insertionSortList(ListNode* head) {
if (nullptr == head) {
return head;
}
ListNode *node = head->next;
ListNode *tail = head;
int maxStep = 1;
while (node != nullptr) {
ListNode *next = node->next;
ListNode *prev = nullptr;
ListNode *cur = head;
int i = 0;
for (i; i < maxStep; i++) {
if (node->val < cur->val) {
tail->next = node->next;
node->next = cur;
if (nullptr == prev) {
head = node;
} else {
prev->next = node;
}
break;
}
prev = cur;
cur = cur->next;
}
if (i >= maxStep) {
tail = tail->next;
}
++maxStep;
node = next;
}
return head;
}