题目
PTA | 程序设计类实验辅助教学平台

错误点
struct ListNode *getodd( struct ListNode **L )
{
typedef struct ListNode node;
node*oddhead=(node*)malloc(sizeof(node));
oddhead->next=NULL;
node*tail=oddhead;
node*head=(node*)malloc(sizeof(node));
head->next=*L;
node*p=head;
while(p->next!=NULL)
{
if(p->next->data%2!=0)
{
node*temp=p->next;
p->next=p->next->next;
temp->next=tail->next;
tail->next=temp;
tail=temp;
}
else
p=p->next;
}
///////!!!!!如果有奇数开头的链表传入,这样子写就会出错
//////由于第一个是奇数,会移入oddhead链表,而L指针也在第一个位置,就把L也移走了
/////所以就会导致输出了两边oddhead
return oddhead->next;
};
修改
struct ListNode *getodd( struct ListNode **L )
{
typedef struct ListNode node;
node*oddhead=(node*)malloc(sizeof(node));
oddhead->next=NULL;
node*tail=oddhead;
node*head=(node*)malloc(sizeof(node));
head->next=*L;
node*p=head;
while(p->next!=NULL)
{
if(p->next->data%2!=0)
{
node*temp=p->next;
p->next=p->next->next;
temp->next=tail->next;
tail->next=temp;
tail=temp;
}
else
p=p->next;
}
//////!!!!!加一行这个就可以了,因为之前已经给L加上了哨兵结点
//////因此在整个链表操作之后,让L重新指回head即可
*L=head->next;
return oddhead->next;
};
结果
