设以带头结点的双向循环链表表示的线性表为 L=(a1, a2, a3, …, an)。试写一时间复杂度 O(n)的算法,将 L 改造为 L=(a1, a3, …, an, …, a4, a2)。要求: (1)描述算法的基本设计思想; (2)根据设计思想,采用 C 语言描述算法,关键之处给出注释。
# include <stdio.h>
# include <stdlib.h>
typedef struct node
{
int data;
struct node * next;
struct node * pre;
} Node;
void InsertDoubleList ( Node* head, int val)
{
Node* ptemp = malloc ( sizeof ( Node) ) ;
ptemp-> data = val;
ptemp-> next = NULL ;
ptemp-> pre = NULL ;
if ( head-> next == NULL && head-> pre == NULL )
{
head-> next = ptemp;
ptemp-> pre = head;
ptemp-> next = head;
head-> pre = ptemp;
}
else
{
ptemp-> next = head-> next;
head-> next-> pre = ptemp;
ptemp-> pre = head;
head-> next = ptemp;
}
}
void PintfDoubleList ( Node* head)
{
Node* ptemp;
ptemp = head-> next;
while ( ptemp != head)
{
printf ( "<--%d--> " , ptemp-> data) ;
ptemp = ptemp-> next;
}
printf ( "\n" ) ;
}
void ChangeList ( Node* head)
{
Node* pcur;
pcur = head-> next;
head-> next = head;
head-> pre = head;
Node* endnode;
endnode = head;
Node* head2 = malloc ( sizeof ( Node) ) ;
head2-> data = 0 ;
head2-> next = head2;
head2-> pre = head2;
int odd = 1 ;
while ( pcur != head)
{
Node* ptemp;
ptemp = pcur;
pcur = pcur-> next;
if ( odd == 0 )
{
ptemp-> next = head2-> next;
head2-> next-> pre = ptemp;
ptemp-> pre = head2;
head2-> next = ptemp;
odd = 1 ;
}
else
{
ptemp-> next = endnode-> next;
ptemp-> pre = endnode;
endnode-> next = ptemp;
endnode = ptemp;
odd = 0 ;
}
}
PintfDoubleList ( head) ;
PintfDoubleList ( head2) ;
endnode-> next = head2-> next;
head2-> next-> pre = endnode;
head2-> pre-> next = head;
head-> pre = head2-> pre;
}
int main ( )
{
int arr[ 6 ] = { 6 , 5 , 4 , 3 , 2 , 1 } ;
Node head;
head. data = 0 ;
head. next = NULL ;
head. pre = NULL ;
Node* p;
p = & head;
int i;
for ( i = 0 ; i < 6 ; i++ )
{
InsertDoubleList ( p, arr[ i] ) ;
}
printf ( "printf double_list:\n" ) ;
PintfDoubleList ( & head) ;
Node* head2 = malloc ( sizeof ( Node) ) ;
head2-> data = 0 ;
head2-> next = NULL ;
head2-> pre = NULL ;
ChangeList ( & head) ;
printf ( "printf double_list:\n" ) ;
PintfDoubleList ( & head) ;
return 0 ;
}