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;
}