17,设计一个算法用于判断带头结点的循环双链表是否对称。
思路:从两头往中间凑,往中间凑的过程中,有一个不等的,就说明不对称,即可退出。当右指针的next等于左指针,说明两个指针彼此错过,即在中间没有退出;如果左指针等于右指针,说明对称。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<stack>
using namespace std;
// 双链表节点
typedef struct Node{
int data;
struct Node *pre, *next;
Node():pre(NULL),next(NULL){};
Node(int d):data(d), pre(NULL),next(NULL){};
}Node, *LinkList;
void isBalanced(LinkList L){
Node * p = L->next;
Node * q = L->pre;
bool flag = false;
while(true){
if(p==q ||q->next == p ){
flag = true;
break;
}
if(p->data == q->data){
p = p->next;
q = q->pre;
continue;
}else{
flag = false;
break;
}
}
cout<<flag;
}
// 输出双循环链表
void show(LinkList L){
Node *p = L->next;
while(p != L){
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
// 头插法创建循环双链表
void createLinkList(vector<int> v, LinkList &L){
L = new Node();
L->next = L;
L->pre = L;
for(int i=0; i<v.size(); ++i){
Node *p = new Node(v.at(i));
p->next = L->next;
L->next->pre = p;
p->pre = L;
L->next = p;
}
}
// 尾插法创建循环双链表
void createLinkList2(vector<int> v, LinkList &L){
L = new Node();
L->next = L;
L->pre = L;
for(int i=0; i<v.size(); ++i){
Node *p = new Node(v.at(i));
p->next = L;
L->pre->next = p;
p->pre = L->pre;
L->pre = p;
}
}
int main() {
int a[]= {1,3,5,4,3,1};
int b[] = {2,3,6,7,10,11};
vector<int> V(a, a+6);
vector<int> V2(b, b+6);
LinkList A, B;
createLinkList2(V, A);
show(A);
isBalanced(A);
return 0;
}