输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
2 2 4 6
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printlist(Odd);
printlist(L);
return 0;
}
struct ListNode *readlist()
{
struct ListNode *head, *tail, *p;
head = tail = NULL;
int data;
while (scanf("%d", &data) && data != -1) {
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->data = data;
p->next = NULL;
if (head == NULL) {
head = p;
} else {
tail->next = p;
}
tail = p;
}
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *head1, *head2, *tail1, *tail2, *ptr, *p;
head1 = head2 = tail1 = tail2 = NULL;
ptr = *L;
while (ptr != NULL) {
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->data = ptr->data;
p->next = NULL;
if (p->data % 2 != 0) {
if (head1 == NULL) {
head1 = p;
} else {
tail1->next = p;
}
tail1 = p;
} else {
if (head2 == NULL) {
head2 = p;
} else {
tail2->next = p;
}
tail2 = p;
}
ptr = ptr->next;
}
L = &head2; //新的偶链表
return head1; //奇数链表
}
/* 你的代码将被嵌在这里 */
以为要返回两个地址,所以传的是地址,
要对链表进行修改,需要传入他的地址,
类似于对整数的修改,传入地址后,直接对形参名称赋值就可修改内容,
所以对二级指针所指向的一级指针赋值就可改变内容