设线性表 L= ( a1 , a2 , a… , an-2 , an-1 , a n ) 采用带头结点的单链表保存,链表中结点定义如下:
typedef struct node {
int data ;
struct node* next ;
} NODE ;
请设计一个空间复杂度为 O ( 1 ) 且时间上尽可能高效的算法,重新排列 L 中的各结点,得到线性表 L’= ( a 1 , a n , a 2 , a n-1 , a 3 , a n-2 … ) 。
要求:
( 1 ) 给出算法的基本设计思想
( 2 ) 根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。
( 3 ) 说明你所设计的算法的时间复杂度。
先在纸上梳理思路和核心代码
方法一(此方法时间复杂度太高但考研中可以得到大多数分数)
方法一完整代码
void fun(Linklist &L)
{
LNode *j=L->next,*i=L->next,*r=L->next,*q=i->next;
while(j)j=j->next;使j成为尾指针
whille(i->next!=j||i->next->next!=j){链表长为偶数和奇数的情况
while(r->next!=j)r=r->next;使r一直为尾指针j的前驱
j->next=q;下面为尾插和保存其他指针的代码
i->next=j;
j=r;
r=L;
i=q;
q=q->next;
}
}
方法二(此方法时间复杂度较小)
在这里插入代码片