设计算法将一个带头结点的单链表A分解为两个具有相同的链表B和C,其中B表的结点为A表中值小于0的结点,而C表的结点为A表中大于0的结点(链表A中的元素为非零整数,要求B,C表利用A表的结点) 完整C++代码
时间: 2024-10-21 10:02:11 浏览: 17
单向链表 操作 经典
为了将单链表A分解为两个链表B(存储负值)和C(存储正值),我们可以采用迭代的方式遍历链表,同时创建两个新的头结点(`ListNode*`)分别代表B和C,并维护两个指针分别指向当前处理的节点。这里是一个简单的C++示例:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构体
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* splitList(ListNode* head) {
// 分别初始化负值链表头结点和正值链表头结点
ListNode* negativeHead = new ListNode(0);
ListNode* positiveHead = new ListNode(0);
// 指针用于遍历链表
ListNode* current = head;
bool isNegative = false; // 标记当前元素是否为负
while (current != nullptr) {
if (current->val < 0) { // 如果发现负数
isNegative = true; // 设置标志
if (negativeHead->next == nullptr) { // 如果B链表为空
negativeHead->next = current;
} else {
ListNode* temp = negativeHead->next;
while (temp->next != nullptr && temp->next->val >= 0) {
temp = temp->next;
}
temp->next = current;
}
} else { // 否则为正数
if (!isNegative) { // 如果不是首次进入正数部分
if (positiveHead->next == nullptr) {
positiveHead->next = current;
} else {
ListNode* temp = positiveHead->next;
while (temp->next != nullptr && temp->next->val <= 0) {
temp = temp->next;
}
temp->next = current;
}
}
isNegative = false; // 重置标志
}
current = current->next; // 移动到下一个节点
}
return positiveHead->next; // 返回C链表的头结点
}
int main() {
// 假设head指向已经存在的链表A
ListNode* head = ...;
ListNode* result = splitList(head);
// 打印链表B(如果需要)
ListNode* tempB = negativeHead->next;
while (tempB != nullptr) {
cout << tempB->val << " ";
tempB = tempB->next;
}
// 打印链表C
tempB = result;
while (tempB != nullptr) {
cout << tempB->val << " ";
tempB = tempB->next;
}
return 0;
}
```
请注意,这个代码假设已经有一个链表头结点`head`指向整个链表A。如果你想看到完整的运行效果,你需要提供具体的链表数据。
阅读全文