用C语言将一个链表按照值的正负分解成两个链表
时间: 2023-06-14 14:02:46 浏览: 61
可以按照以下步骤实现:
1. 定义一个结构体来表示链表节点,包括一个整数值和一个指向下一个节点的指针。例如:
```c
struct ListNode {
int val;
struct ListNode* next;
};
```
2. 定义两个指针分别指向正数链表和负数链表的头节点,初始化为 `NULL`。
```c
struct ListNode* posHead = NULL; // 正数链表头节点
struct ListNode* negHead = NULL; // 负数链表头节点
```
3. 遍历原链表,对于每个节点,如果它的值为正数,则将它插入到正数链表中;如果它的值为负数,则将它插入到负数链表中。
```c
struct ListNode* p = originalHead; // 原链表头节点
while (p != NULL) {
if (p->val >= 0) {
// 将节点插入到正数链表中
if (posHead == NULL) {
posHead = p;
} else {
struct ListNode* posTail = posHead;
while (posTail->next != NULL) {
posTail = posTail->next;
}
posTail->next = p;
}
} else {
// 将节点插入到负数链表中
if (negHead == NULL) {
negHead = p;
} else {
struct ListNode* negTail = negHead;
while (negTail->next != NULL) {
negTail = negTail->next;
}
negTail->next = p;
}
}
p = p->next;
}
```
4. 将正数链表的尾节点指向负数链表的头节点,形成一个新的链表。
```c
if (posHead != NULL) {
struct ListNode* posTail = posHead;
while (posTail->next != NULL) {
posTail = posTail->next;
}
posTail->next = negHead;
} else {
posHead = negHead;
}
```
5. 返回新链表的头节点。
```c
return posHead;
```