https://pintia.cn/problem-sets/12/problems/365
代码:
思路
原链表第一个元素为奇(偶)数,则找到第一个偶(奇)数,将偶(奇)数新建节点连成新的链表。
struct ListNode *readlist()
{
struct ListNode* head = NULL;
struct ListNode* last = NULL;
int num;
while(1) {
scanf("%d", &num);
if(num == -1) break;
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->data = num;
p->next = NULL;
if(head == NULL) {
head = p;
last = head;
}
else {
last->next = p;
last = p;
}
}
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
if(!*L) return NULL;
struct ListNode* Head = *L;
struct ListNode *oddhead, *oddlast, *evenhead, *evenlast, *t;
oddhead = oddlast = evenhead = evenlast = Head;
t = Head;
if(Head->data % 2 == 1)//链表第一个是奇数
{
evenhead = NULL;
//找到第一个偶数
while(t && t->data % 2 == 1) {
oddlast = t;//oddlast指向t前一个
t = t->next;
}
while(t) {
//t所指为偶数
if(t->data % 2 == 0) {//则申请空间存放
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->data = t->data;
p->next = NULL;
if(evenhead == NULL) {
evenhead = p;
evenlast = p;
}
else {
evenlast->next = p;
evenlast = p;
}
//删除原链表该元素
if(t->next) {
if(t->next->data % 2 == 1) {
oddlast->next = t->next;
oddlast = t->next;
}
}
else {
oddlast->next = NULL;
}
}
t = t->next;
}
*L = evenhead;
return oddhead;
}
else {
oddhead = NULL;
//找到第一个奇数
while(t && t->data % 2 == 0) {
evenlast = t;//evenlast指向t前一个
t = t->next;
}
while(t) {
//t所指为奇数
if(t->data % 2 == 1) {//则申请空间存放
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->data = t->data;
p->next = NULL;
if(oddhead == NULL) {
oddhead = p;
oddlast = p;
}
else {
oddlast->next = p;
oddlast = p;
}
//删除原链表该元素
if(t->next) {
if(t->next->data % 2 == 0) {
evenlast->next = t->next;
evenlast = t->next;
}
}
else {
evenlast->next = NULL;
}
}
t = t->next;
}
*L = evenhead;
return oddhead;
}
}