栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一、题目描述

判断循环双链表是否对称

二、解题思路

解题思路很简单,跟判断回文数的方法类似,只不过换成了链表。
首先需要写出循环双链表,第二,则判断是否对称
判断是否对称,定义两个指针,p1指针指向头指针的后继(头遍历指针),p2指针指向头指针的前驱(尾遍历指针),判断当二者的数据域相等时,p1指向其后继,p2指向其前驱,一旦不相等则不对称。

结束条件:

  • 当结点个数为奇数个时,中间会多出一个结点,当p1和p2指针都指向这个结点的时候结束,即p1指针等于p2指针时,结束;
  • 当结点个数为偶数个时,p2指针的后继指针等于p1指针(或者 p1指针的前驱指向p2指针),结束。
注意:

偶数结点时,结束条件一定是 头遍历指针的前驱不等于后遍历指针 或者 尾遍历指针的后继不等于前遍历指针

三、代码实现
#include 

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;idata=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<<"对称"< 
四、结果 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312052.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号