单链表第十七题(判断循环双链表是否对称)

 17.设计一个算法用于判断带头结点的循环双链表是否对称

第一:创建一个循环双链表

其次:实现题目要求

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"basicNodeType.h"//通过自创建头文件引入结构体,ctrl+鼠标左键点击即可查看
//双链表
struct  DLink{
      BNODETYPE    data;
       DLink* next;
       DLink* pre;        
};
DLink   *createDouLoopLink(){
        int   n,data;
        DLink*head(DLink*)malloc(sizeof(DLink));
        head->next=NULL;
        head->pre=NULL;
        DLink*p=head;
        printf("请输出节点个数:n="); 
        scanf("%d ",&n);
        for(int  i=0;i<n;i++){
              printf("请输出节点个数:i+1");
              scanf("%d",&data);
              DLink*newP=(DLink)malloc(sizeof(DLink));
              newP->data=data;
              newP->pre=p;
              p->next=newP;
              p=newP; 
           }         
         p->next=head;    
         head->pre=p;
         return   head; 
 
}
//int  main()
//   DLink*h=createDouloopLink();
//   return   0;

struct  Link{
     int  data;
     struct   Link   *next;
     struct   Link   *pre;
};
#define_CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void   isSymmetry(Link  *h){
       struct  Link   *pre=h->next,*next=h->next;
       while(pre!=next&&pre->pre!=next){
             //此时存在两种情况,奇数个节点和偶数个节点都要考虑
            if(pre->data!=next->data){
                   printf("该循环双链表不对称");
                   break;
             }
             else{
                 pre=pre->pre;
                 next=next->next;
                }
            }
          if(pre==next||pre->pre==next){
             printf("该循环双链表对称:"); 
          }   

}
int  main(){
     struct  Link*head;
     Link *createDouLoopLink();
     head=createDouLoopLink();
     isSymmetry(head);
     return  0;   
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断循环双链表是否对称,可以先找到链表的中间节点,然后将后半部分链表反转,最后比较两部分链表是否相同即可。 以下是判断循环双链表是否对称的主函数的示例代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct ListNode { int val; struct ListNode* prev; struct ListNode* next; } ListNode; // 反转链表 ListNode* reverseList(ListNode* head) { if (head == NULL || head->next == NULL) { return head; } ListNode* prev = NULL; ListNode* curr = head; while (curr != NULL) { ListNode* next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; } // 判断循环双链表是否对称 int isSymmetric(ListNode* head) { if (head == NULL || head->next == NULL) { return 1; } // 找到链表的中间节点 ListNode* slow = head; ListNode* fast = head; while (fast != NULL && fast->next != NULL) { slow = slow->next; fast = fast->next->next; } // 反转后半部分链表 ListNode* secondHalf = reverseList(slow); // 比较前半部分链表和反转后的后半部分链表是否相同 ListNode* p1 = head; ListNode* p2 = secondHalf; while (p1 != NULL && p2 != NULL) { if (p1->val != p2->val) { return 0; } p1 = p1->next; p2 = p2->next; } return 1; } int main() { // 构造循环双链表 1 <-> 2 <-> 3 <-> 2 <-> 1 ListNode* head = (ListNode*)malloc(sizeof(ListNode)); head->val = 1; head->prev = NULL; ListNode* node1 = (ListNode*)malloc(sizeof(ListNode)); node1->val = 2; node1->prev = head; head->next = node1; ListNode* node2 = (ListNode*)malloc(sizeof(ListNode)); node2->val = 3; node2->prev = node1; node1->next = node2; ListNode* node3 = (ListNode*)malloc(sizeof(ListNode)); node3->val = 2; node3->prev = node2; node2->next = node3; ListNode* node4 = (ListNode*)malloc(sizeof(ListNode)); node4->val = 1; node4->prev = node3; node3->next = node4; node4->next = head; head->prev = node4; // 判断循环双链表是否对称 int isSym = isSymmetric(head); printf("%d\n", isSym); return 0; } ``` 输出结果为: ``` 1 ``` 表示循环双链表对称的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值