已知不带头结点的单链表l中的数据元素为(a1,a2,a3,…,an),试编写算法将其重新排列为以a1为界的两部分:a1前面的值均比a1小,a1后面的值都比a1大。
时间: 2023-04-25 07:05:29 浏览: 77
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同)
算法步骤如下:
1. 定义两个指针p和q,分别指向链表的第一个节点和第二个节点。
2. 遍历链表,将小于a1的节点插入到p节点之前,将大于a1的节点插入到q节点之后。
3. 最后将p节点和q节点之间的节点按照大小顺序重新排列。
具体实现细节可以参考下面的代码:
void rearrangeList(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return;
}
ListNode* p = head;
ListNode* q = head->next;
while (q != nullptr) {
if (q->val < head->val) {
ListNode* tmp = q;
q = q->next;
tmp->next = p;
head = tmp;
} else {
p->next = q;
p = q;
q = q->next;
}
}
p->next = nullptr;
ListNode* mid = head;
while (mid->next != nullptr) {
mid = mid->next;
}
mid->next = head->next;
head->next = nullptr;
ListNode* pre = nullptr;
ListNode* cur = mid->next;
while (cur != nullptr) {
ListNode* next = cur->next;
if (cur->val < head->val) {
cur->next = head;
head = cur;
} else {
pre = head;
while (pre->next != nullptr && pre->next->val < cur->val) {
pre = pre->next;
}
cur->next = pre->next;
pre->next = cur;
}
cur = next;
}
}
阅读全文