单链表用c语言实现奇数移至表头偶数移至表尾
时间: 2024-11-03 13:15:51 浏览: 2
C语言实现单链表
单链表中将奇数节点移到表头、偶数节点移到表尾的操作可以通过遍历链表并利用三个指针来完成。以下是C语言的一个基本实现步骤:
1. 初始化三个指针:`prev`用于记录前一个节点,`even`和`odd`分别指向当前处理的偶数节点和奇数节点。
2. 遍历链表:
- 如果节点值是奇数(通常是通过 `node->val % 2 == 1` 判断),将它与 `prev` 指向的节点交换位置,然后将 `odd` 指针移动到当前节点,`prev` 更新为当前节点。
- 否则,如果节点值是偶数,直接将 `even` 指针更新为当前节点,继续向前搜索。
3. 最后,当遍历完链表后,需要调整头部和尾部的链接:
- 将 `odd` 指向的节点设置为新的头节点(如果 `odd` 没有改变,表示链表中所有元素都是偶数,那么新头就是原头节点)。
- 将 `even` 指向的节点设置为新的尾节点(如果没有偶数节点,新尾就是原尾节点或空)。
```c
struct ListNode {
int val;
struct ListNode *next;
};
void oddEvenList(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return; // 如果链表为空或只有一个节点,无需操作
}
struct ListNode *even = head->next, *odd = head, *prev = NULL;
while (even != NULL && even->next != NULL) {
// 奇数节点
if ((odd->val % 2) == 1) {
if (prev != NULL) {
prev->next = odd->next;
} else {
head = odd->next;
}
odd->next = even->next;
even->next = odd;
prev = odd;
odd = odd->next;
}
// 偶数节点
else {
prev = even;
even = even->next;
}
}
// 结束处理,将剩余的节点插入正确位置
if (even != NULL) {
prev->next = even;
} else {
prev->next = odd;
}
}
```
阅读全文