判断循环双链表是否对称
二、解题思路解题思路很简单,跟判断回文数的方法类似,只不过换成了链表。
首先需要写出循环双链表,第二,则判断是否对称
判断是否对称,定义两个指针,p1指针指向头指针的后继(头遍历指针),p2指针指向头指针的前驱(尾遍历指针),判断当二者的数据域相等时,p1指向其后继,p2指向其前驱,一旦不相等则不对称。
结束条件:
- 当结点个数为奇数个时,中间会多出一个结点,当p1和p2指针都指向这个结点的时候结束,即p1指针等于p2指针时,结束;
- 当结点个数为偶数个时,p2指针的后继指针等于p1指针(或者 p1指针的前驱指向p2指针),结束。
偶数结点时,结束条件一定是 头遍历指针的前驱不等于后遍历指针 或者 尾遍历指针的后继不等于前遍历指针
#includeusing 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 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 >arr[i]; } Cirlink C1(arr,n); if(C1.judge()){ cout<<"对称"< 四、结果



