题目:设C={a1,b1,a2,b2,…an,bn}为线性表,采用带头结点的hc单链表存放,
设计一个就地算法,将其拆分为两个线性表,
使得A={a1,a2,…an},B={bn,bn-1,…b2,b1}
关键字:带头结点单链表 +分解+逆序
思路1
采用第10题的思路,借助访问序号小助手
思路2
不使用序号小助手
while循环中的代码改为将结点插入到表A中并将下一个结点插入到B中,
然后逐步循环这个操作,one for A,one for B ||one for A,one for B ||…
另外,由于B是逆置,所以使用头插法
需要变量:
A,B表头结点指针:A,B
A表(旧表)的工作指针p,尾指针ra (执行尾插法),后继指针q(防断链)
LinkList DisCreat_2(LinkList & A){
LinkList B=(LinkList)malloc(sizeof(LNode));//创建B表表头
B->next=NULL;//初始化B表
LNode*p=A->next,*q;//p为工作指针,q为
LNode*ra=A;//ra为表尾指针,始终指向A的尾结点
while(p!=NULL){
ra->next=p;ra=p;//ra作为尾指针,负责将每次断裂的A表链接会去
p=p->next;//p遍历原来A表
if(p!=NULL)
q=p->next;//q是原来A表中的后继结点,负责防止断链,这一步必须在把当前结点链给B表之前做
p->next=B->next;//头插法构造B表
B->next=p;//
p=q;//p回到A表
}
ra->next=NULL;//rb->next=NULL可以省略,因为B表是头插法,一开始的b1已经设置了指向null
return B;
}
}