题目:设C={a1,b1,a2,b2…an,bn}为线性表,采用带头节点的hc单链表存放,设计一个就地算法,将其线性表拆分为两个线性表,使得A={a1,a2,a3…an},B={bn,bn-1,…b2,b1}。
分析:因为链表A是顺序存放,所以用尾插法,而链表B是逆序存放,所以用头插法,根据链表C的特征,可见是尾插一次头插一次,一直循环直到把链表C拆分完。
(口诀:头插防断链,尾插留指针!)留的是尾指针
算法思想:遍历C链表,
第一个结点a1尾插在链表A(因为尾插是顺序插入),
第二个结点b1头插在链表B(因为头插是逆序插入),
第三个结点a2尾插在链表A,
第四个结点b2头插在链表B,
照此以往,直到将链表C拆分为A、B两个链表。
代码:
Linklist create_AB(Linklist &hc){
LNode *r; //r是头插是防止断链要用的
LNode *p=hc->next; //p是工作指针,用来遍历
//申请头结点,因为题目里没给
A=(Linklist)malloc(sizeof(LNode));
B=(Linklist)malloc(sizeof(LNode));
A->next=Null; //链表A的第一个指针置空
LNode *ra=A; //ra表示A的尾指针
B->next=Null; //链表B的第一个指针置空
LNode *rb=B; //rb表示B的尾指针
while(p!=Null){
ra->next=p; //尾插法,必会
ra=p;
p=p->next;
if(p!=Null){ //判断如果给A插完了还有数据,就给B插
r=p->next; //r放p后面,防止断链
p->next=rb->next; //头插法,必会
rb->next=p;
p=r;
}
}
return A;
return B;
}