#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node *next;
} Node;

Node *splitList(Node *head, Node **oddHead) {
    Node *evenHead = NULL;
    Node *cur = head, *prev = NULL;
    while (cur != NULL) {
        if (cur->data % 2 == 0) {
            if (evenHead == NULL) {
                evenHead = cur;
            } else {
                prev->next = cur;
            }
            prev = cur;
        } else {
            if (*oddHead == NULL) {
                *oddHead = cur;
            } else {
                Node *oddCur = *oddHead;
                while (oddCur->next != NULL) {
                    oddCur = oddCur->next;
                }
                oddCur->next = cur;
            }
        }
        cur = cur->next;
    }
    if (prev != NULL) {
        prev->next = NULL;
    }
    return evenHead;
}

void printList(Node *head) {
    while (head != NULL) {
        printf('%d ', head->data);
        head = head->next;
    }
    printf('
');
}

int main() {
    Node *head = NULL;
    Node *oddHead = NULL;
    int n, x;
    scanf('%d', &n);
    for (int i = 0; i < n; i++) {
        scanf('%d', &x);
        Node *node = (Node *) malloc(sizeof(Node));
        node->data = x;
        node->next = head;
        head = node;
    }
    Node *evenHead = splitList(head, &oddHead);
    printf('Even list: ');
    printList(evenHead);
    printf('Odd list: ');
    printList(oddHead);
    return 0;
}
C语言单链表拆分:偶数结点与奇数结点分离

原文地址: https://www.cveoy.top/t/topic/n34F 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录