一、题目描述
判断循环双链表是否对称
二、解题思路
解题思路很简单,跟判断回文数的方法类似,只不过换成了链表。
首先需要写出循环双链表,第二,则判断是否对称
判断是否对称,定义两个指针,p1指针指向头指针的后继(头遍历指针),p2指针指向头指针的前驱(尾遍历指针),判断当二者的数据域相等时,p1指向其后继,p2指向其前驱,一旦不相等则不对称。
结束条件:
- 当结点个数为奇数个时,中间会多出一个结点,当p1和p2指针都指向这个结点的时候结束,即p1指针等于p2指针时,结束;
- 当结点个数为偶数个时,p2指针的后继指针等于p1指针(或者 p1指针的前驱指向p2指针),结束。
注意:
偶数结点时,结束条件一定是 头遍历指针的前驱不等于后遍历指针 或者 尾遍历指针的后继不等于前遍历指针
三、代码实现
#include <iostream>
using namespace std;
struct Node{
Node *next,*pre;
int data;
};
class CirLink{
private:
Node *first,*rear;
public:
CirLink(int *arr,int n);
~CirLink();
int judge();
};
CirLink::CirLink(int *arr,int n){
Node *s=NULL;
first=new Node;
first->next=NULL;
rear=first;
for(int i=0;i<n;i++){
s=new Node;
s->data=arr[i];
s->next=rear->next;
s->pre=rear;
rear->next=s;
rear=s;
}
rear->next=first;
first->pre=rear;
}
CirLink::~CirLink(){
Node *p=first;
while(p!=rear){
first=first->next;
delete p;
p=first;
}
delete rear;
}
int CirLink::judge(){
Node *p1=first->next;
Node *p2=first->pre;
while(p1!=p2&&p2->next!=p1){//奇数个结点和偶数个结点结束条件不相同
if(p1->data==p2->data){
p1=p1->next;
p2=p2->pre;
}else
return 0;
}
return 1;
}
int main(){
//输入数组长度
int n;
cin>>n;
int *arr=new int[n];
for(int i=0;i<n;i++){
cin>>arr[i];
}
CirLink C1(arr,n);
if(C1.judge()){
cout<<"对称"<<endl;
}else{
cout<<"不对称"<<endl;
}
return 0;
}