题目
设线性表L=(a1,a2,a3,…,an-2,an-1,an)采用带头结点的单链表保存,链表中的结点定义如下:
typedef struct node{
int data;
struct node *next;
}NODE;
请设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各结点,得到线性表L’=(a1,an,a2,an-1,a3,an-2,…)。
题解
分析
题目要求将L重新排列,取第一个,再取倒数第一个,取第二个,再取倒数第二个,以此类推。
单链表只有向后的指针,需要实现倒着获取元素,可以将链表L后半段逆置。链表L即分为两段,依此获取即可。
代码
void change_list(NODE *h){
NODE *p,*q,*r,*s;
p=q=h;
while(q->next!=NULL){
p=p-next;
q=q->next;
if(q->next!=NULL) q=q->next;
}
//逆置
q=p->next;
p->next=NULL;
while(q!=NULL){
r=q->next;
q->next=p->next;
p->next=q;
q=r;
}
s=h->next;
q=p->next;
p->next=NULL;
while(q!=NULL){
r=q->next;
q->next=s->next;
s->next=q;
s=q->next;
q=r;
}
}