用c++写题目描述: 给定一个链表,判断该链表是否是回文结构。 例如: 1->2->3->2->1 是回文链表。 1->2->3->3->2->1 是回文链表。 输入:待判断的整数链表 输出:若是回文结构则输出1,否则输出0。4
时间: 2023-06-10 08:06:29 浏览: 153
题目描述:
给定一个链表,判断该链表是否是回文结构。
例如:1->2->3->2->1 是回文链表。
1->2->3->3->2->1 是回文链表。
输入:
待判断的整数链表。
输出:
若是回文结构则输出1,否则输出0。
代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
//定义链表节点
typedef struct ListNode{
int val;
struct ListNode *next;
}ListNode;
//创建链表
ListNode* createList(int n){
ListNode *head = (ListNode*)malloc(sizeof(ListNode));
ListNode *p = head;
for(int i=1; i<=n; i++){
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = i;
p->next = newNode;
p = p->next;
}
return head->next;
}
//反转链表
ListNode* reverseList(ListNode *head){
ListNode *prev = NULL;
ListNode *cur = head;
while(cur != NULL){
ListNode *next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
//判断回文链表
int isPalindrome(ListNode* head){
if(head == NULL || head->next == NULL){
return 1;
}
ListNode *slow = head;
ListNode *fast = head;
while(fast->next != NULL && fast->next->next != NULL){
slow = slow->next;
fast = fast->next->next;
}
ListNode *mid = slow;
ListNode *secondHead = reverseList(mid->next);
ListNode *p1 = head;
ListNode *p2 = secondHead;
int res = 1;
while(p2 != NULL){
if(p1->val != p2->val){
res = 0;
break;
}
p1 = p1->next;
p2 = p2->next;
}
mid->next = reverseList(secondHead);
return res;
}
int main(){
//创建链表
ListNode *head = createList(5);
//打印链表
ListNode *p = head;
while(p != NULL){
printf("%d ",p->val);
p = p->next;
}
printf("\n");
//判断回文链表
int res = isPalindrome(head);
printf("%d\n",res);
return 0;
}
```
注释详细,逻辑清晰。
阅读全文