判断头结点的循环双链表是否对称的主函数怎么写
时间: 2024-03-02 12:51:59 浏览: 83
判断循环双链表是否对称,可以先找到链表的中间节点,然后将后半部分链表反转,最后比较两部分链表是否相同即可。
以下是判断循环双链表是否对称的主函数的示例代码:
```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
```
表示循环双链表是对称的。
阅读全文