您的位置:首页 > 理论基础 > 数据结构算法

将双向循环链表L=(a1,a2,...,an)改造成L=(a1,a3,...,an,...,a4,a2)

2014-04-25 22:58 351 查看
设以带头结点的双向循环链表表示的线性表L=(a1,a2,...,an)。试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3,...,an,...,a4,a2)。

双向循环链表类型定义如下:
typedef struct BiNode {
ElemType       data;
int            freq;
struct BiNode *prev,
*next;
} BiNode, *BiLinkList;

实现函数如下:

void ReverseEven(BiLinkList &L)
{
BiLinkList p,q,s,r;
int i = 0;
q = L;
p = L;
p = p -> next;
r = p;
while(p -> next != L){
s = p -> next;
i++;    /**i值表示当前p指针的指向**/
if(i%2 == 0){  /**将第偶数个指针移到头指针左边**/
q -> prev = p;
p -> next = q;
q = q -> prev;
p = s;            /**记录p点**/
r -> next = s;   /**将s指针指向的节点与修改后的前一节点相连接**/
s -> prev = r;
r = r -> next;
}
else    /**不符合条件,p指针往后移**/
p = p -> next;
}
p -> next = q;
q -> prev = p;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息