用C++某非空单链表L中所有元素为整数,设计一个算法将所有小于0的结点移到所有大于等于0的结点的前面
时间: 2024-10-29 20:19:10 浏览: 23
在C++中,为了实现这个功能,你可以创建两个指针,分别指向当前处理的节点以及找到的第一个大于等于0的节点。然后遍历链表,当遇到小于0的节点时,将其从原链表前移至新链表的头部,同时更新原链表的位置。以下是算法步骤:
1. 定义两个指针:`prev` 和 `current`,初始都设为 `nullptr`,表示头指针;另外还有一个临时变量 `negativeHead` 用于保存负数链表的头结点。
2. 遍历链表:
a. 如果当前节点 `current` 的值小于0,将它与 `prev` 指向的节点交换位置,并将 `negativeHead` 更新为 `current`。接着,移动 `prev` 到 `current`。
b. 否则,如果 `current` 的值大于等于0,将 `prev` 指向前进一步,即 `prev = current`。
c. 移动到下一个节点,`current = current->next`。
3. 当遍历完整个链表后,`prev` 就会到达第一个大于等于0的节点,这时原链表中剩余的部分就是所有的正数。最后将 `negativeHead` 所指的负数链表插入到原链表的开始位置。
以下是伪代码形式的实现:
```cpp
struct ListNode {
int val;
ListNode* next;
};
ListNode* separatePositiveAndNegative(ListNode* head) {
ListNode* negativeHead = new ListNode();
ListNode* prev = negativeHead;
ListNode* current = head;
while (current != nullptr) {
if (current->val < 0) {
prev->next = current->next;
current->next = negativeHead->next;
negativeHead->next = current;
prev = current;
} else {
if (prev != current) {
prev = prev->next;
}
}
current = current->next;
}
return head == negativeHead ? negativeHead->next : head;
}
```
阅读全文