用c语言写一篇奇偶链表
时间: 2023-12-08 18:36:41 浏览: 88
以下是用C语言实现奇偶链表的代码和注释:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建链表函数,返回链表头指针
ListNode* createList() {
ListNode *head = (ListNode*)malloc(sizeof(ListNode)); // 创建头节点
head->next = NULL; // 头节点的next指针指向NULL
ListNode *tail = head; // 定义尾指针,初始指向头节点
int data;
scanf("%d", &data);
while (data != -1) { // 输入-1表示链表输入结束
ListNode *cur = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点
cur->val = data; // 新节点的值为输入的值
cur->next = NULL; // 新节点的next指针指向NULL
tail->next = cur; // 尾指针的next指针指向新节点
tail = cur; // 尾指针指向新节点
scanf("%d", &data);
}
return head; // 返回头指针
}
// 分离奇偶链表函数,返回新链表头指针
ListNode* oddEvenList(ListNode* head) {
if (head == NULL || head->next == NULL) { // 如果链表为空或只有一个节点,直接返回原链表头指针
return head;
}
ListNode *odd = head; // 定义奇数节点指针,初始指向头节点
ListNode *even = head->next; // 定义偶数节点指针,初始指向第二个节点
ListNode *evenHead = even; // 定义偶数链表头指针,初始指向第二个节点
while (even != NULL && even->next != NULL) { // 遍历链表,将奇数节点和偶数节点分别连接起来
odd->next = even->next; // 奇数节点的next指针指向下一个奇数节点
odd = odd->next; // 奇数节点指针指向下一个奇数节点
even->next = odd->next; // 偶数节点的next指针指向下一个偶数节点
even = even->next; // 偶数节点指针指向下一个偶数节点
}
odd->next = evenHead; // 将奇数链表和偶数链表连接起来
return head; // 返回原链表头指针
}
int main() {
ListNode *head = createList(); // 创建链表
head = oddEvenList(head); // 分离奇偶链表
ListNode *cur = head->next; // 定义指针,指向第一个节点
while (cur != NULL) { // 遍历链表,输出每个节点的值
printf("%d ", cur->val);
cur = cur->next;
}
return 0;
}
```
阅读全文