实现基于单链表的插入排序算法:即给定一个无序链表,通过插入排序算法,生成有序链表(不能使用数组或向量作为辅助数据空间,不能使用STL中list类)。
时间: 2024-10-03 20:03:44 浏览: 27
实现基于单链表的插入排序算法通常涉及到以下几个步骤:
1. **初始化**:
首先,创建一个新的头节点,表示空的有序链表。
2. **遍历**:
对于输入链表中的每一个元素,假设当前元素为`curr`,执行以下操作:
a. 创建一个新的临时节点`temp`,将`curr`的值存储在`temp`。
b. 将`temp`设置为`head`(初始为空)。
3. **插入**:
- 初始化两个指针`prev`和`current`,分别指向`head`和`temp`。
- 当`current`不为空时,进入循环:
i. 检查`current->value`是否小于`previous->value`。如果大于,说明应该把`current`插入到`previous`之后。
ii. 如果`previous`为`head`(第一次迭代),将`current`设为`head`的下一个节点,并更新`current`指向`current->next`。
iii. 否则,逐步移动`previous`,直到找到一个位置(或者到达链表末尾)使得`previous->value >= current->value`。
- `previous->next = current->next`
- 然后`previous = current`
4. **链接新元素**:
当`current`到达其原始位置后,将其`next`指向前一个找到的适当位置,然后`current = current->next`。
5. **更新头节点**:
最后,当所有元素都插入完毕后,链表的头节点就是有序的。
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* insertionSortList(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode dummy(0);
dummy.next = head;
ListNode *current = head;
while (current != nullptr && current->next != nullptr) {
ListNode *previous = &dummy;
while (previous->next != current && previous->next->val < current->val) {
previous = previous->next;
}
if (previous != &dummy) {
current->next = previous->next;
previous->next = current;
} else {
current = current->next;
}
}
return dummy.next;
}
```
阅读全文