【数据结构】判断循环双链表是否对称

一、题目描述

判断循环双链表是否对称

二、解题思路

解题思路很简单,跟判断回文数的方法类似,只不过换成了链表。
首先需要写出循环双链表,第二,则判断是否对称
判断是否对称,定义两个指针,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;
}

四、结果在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 13
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mae_strive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值