1.全倒置
我是灵魂画手
第一次循环是断开第一结点和第二结点连线(p->next=L->next=NULL,这样第一个结点就指向空)
第二次循环将第二个结点连到第一结点之后(插入头结点之后),然后头结点再连接第二结点,指针p到q指针那里复位
第三次循环将第三结点连接第二结点之后,然后头结点连接第三结点,p复位 ,
以此类推
void FixTwo(List L){//倒置
Node *q,*p;
p=L->next;//p指向第一个结点
L->next=NULL;//L的指针域为空
while(p!=NULL){
q=p->next;//q作为标记指针永远指向p的下个结点,用于p指针复位
p->next=L->next;//p结点指向头结点的下个结点
L->next=p;//头结点指向p结点
p=q;//p复位指向下个结点
}
}
2.循环
首先两个循环单链表LA,LB 。p,q两个指针分别指向这两个链表,遍历链表找到表尾指针,第一个链表尾部指向第二个链表的第一结点,第二个链表的尾指向第一链表的头结点。
3.奇数位逆序偶数位顺序
第一步先将,p记录第一结点,L指向空,创建一个新的Lb,q指向第二结点,判断i=1,第一结点指向空,头结点指向第一结点p,p指向q;
第二步i等于2时候执行else,尾插法,顺次下去
第三步i等于3继续头插入第一个结点
第四第五同上方法。
void Divide(List L,List &Lb){//链表奇数位逆序,偶数位正序
Node *p,*q;
int i=1;
p=L->next;
L->next=NULL;
Lb=new Node;
Lb->next=NULL;
Node*real=Lb;
while(p){
q=p->next;
if(i%2==1){
p->next=L->next;
L->next=p;
}
else {
real->next=p;
real=p;
}
p=q;
i++;
}
}