数据结构综合应用题③
问题:设计一个算法,将头节点为A的单链表(其数据域为整数)分解成两个单链表A和B,使得A链表只含有链表中data域为奇数的结点,而B链表只含有原链表中data域为偶数的结点,且保持原来的相对顺序。
解题思路:用指针p从头到尾扫描A链表,当发现结点data域为偶数的结点则取下,插入链表B中。因为题目要求保持原来数据元素的相对顺序,所以要用尾插法来建立B链表
答案:
void splits2(LNode *A,LNode *&B)
{
LNode *p,*q,*r;
B=(LNode*)malloc(sizeof(LNode));//申请链表B的头结点
B->next=NULL;//每申请一个新节点,将其指针域next设置为NULL
//这样可以避免很多因链表的终端节点忘记置NULL而产生的错误
r=B;
p=A;
while(p->next!=NULL)//p始终指向当前被判断结点的前驱结点,这和删除结点类似,因为取下一个结点就是删除结点,只是不释放这个结点的内存空间而已
{
if(p->next->data%2==0)//判断结点的data域是否为偶数,是偶数则从链表中取下
{
q=p->next;//q指向要从链表中取下的结点
p->next=q->next;//从链表中取下这个结点
q->next=NULL;
r->next=q;
r=q;
}
else p=p->next;//p后移一个位置,即开始检查下一个结点
}
}