题目:设以带头结点的双向循环链表表示的线性表L=(a1,a2,…..,an).试写出一时间复杂度为o(n)的算法,将L改造为L=(a1,a3,…,an,a4,a2).

1.算法分析

①观察结果可得是将偶数元素前后链接到一起,后将改偶数元素插入到尾元素和头节点之间。

②所以为了简便可以只对偶数元素进行操作,改变前一元素的后继,和后一个元素的前驱,再通过指针将偶元素插入到尾节点和头节点之间,在遇到奇数元素进行跳过处理,一共需要三个指针帮助。

2.核心代码展示

void Change(DLinkList L) {//交换链表使其变换成相应格式

    DLinkList p = L->next, q = NULL, r = L->per;

    int i = 1;

    while (p != r) {

         if (i % 2 == 0) {//在指针指向偶数元素时进行操作

             q = p;

             p = p->next;

             //改变前面元素的后继和后面元素的前驱

             q->per->next = q->next;

             q->next->per = q->per;

             //将偶数元素插到最后一元素和头节点之间

             q->per = r;

             r->next->per = q;

             q->next = r->next;

             r->next = q;

         }

         else {

             p = p->next;

         }

         i++;

    }

}

3.完整代码展示

#include<iostream>

using namespace std;

#define datatype char

typedef struct DLnode {//创建双向循环链表结构

    datatype data;

    struct DLnode* per, * next;

}DLNode,*DLinkList;

DLinkList CreateFormHead() {//向双向循环链表输入元素

    DLinkList L;

    DLNode* s, * r;

    char c;

    int flag = 1;

    L = (DLinkList)malloc(sizeof(DLNode));

    L->next = NULL;

    r = L;

    while (flag) {

         c = getchar();

         if (c != '$') {

             s = (DLinkList)malloc(sizeof(DLNode));

             s->data = c;

             r->next = s;

             r->next->per = r;

             r = s;

         }

         else {

             flag = 0;

             r->next = L;

             r->next->per = r;

         }

    }

    return L;

}

void printf(DLinkList L) {//输出双向循环链表的元素

    DLinkList p;

    p = L->next;

    while (p != L) {

         cout << p->data << endl;

         p = p->next;

    }

}

void Change(DLinkList L) {//交换链表使其变换成相应格式

    DLinkList p = L->next, q = NULL, r = L->per;

    int i = 1;

    while (p != r) {

         if (i % 2 == 0) {//在指针指向偶数元素时进行操作

             q = p;

             p = p->next;

             //改变前面元素的后继和后面元素的前驱

             q->per->next = q->next;

             q->next->per = q->per;

             //将偶数元素插到最后一元素和头节点之间

             q->per = r;

             r->next->per = q;

             q->next = r->next;

             r->next = q;

         }

         else {

             p = p->next;

         }

         i++;

    }

}

int main() {

    DLinkList L = CreateFormHead();

    Change(L);

    printf(L);

    return 0;

}

4.结果

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值