目录
题目:
【题目描述】
有一含n个节点的单向链表,每个节点的数据域为一个整数,请判断这个链表是否为回文链表。
【说明】
空链表是回文形式链表。
【输入描述】
输入包括两行,第一行1个数字n(n<50),表示链表节点数量,第二行有连续n个整数数字,表示节点的数据。
【输出描述】
输出只有true或者false。是回文形式输出true,否则输出false。
【输入样例】
4
1 2 2 1
【输出样例】
true
思路:
将链表反转 看与原链表是否相同 相同就是 反之则不是
代码:
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int data;
struct ListNode* next;
};
//用于创建n个节点的链表
struct ListNode* Create(int n);
//判断以head为头指针的链表是否是回文形式链表。是返回1,不是返回0
int isPalindrome(struct ListNode* head);
int main()
{
int n;
scanf("%d", &n);
struct ListNode* A = Create(n);
int c = isPalindrome(A);
if (c == 1)
{
printf("true");
}
else
printf("false");
return(0);
}
//用于创建n个节点的链表
struct ListNode* Create(int n)
{
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* pmove = (struct ListNode*)malloc(sizeof(struct ListNode));
pmove = head;
scanf("%d", &head->data);
head->next = NULL;
for (int i = 0; i < n - 1; i++)
{
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d", &newnode->data);
pmove->next = newnode;
newnode->next = NULL;
pmove = pmove->next;
}
return head;
}
//判断以head为头指针的链表是否是回文形式链表。是返回1,不是返回0
int isPalindrome(struct ListNode* head)
{
int n = 0;
struct ListNode* pmove = (struct ListNode*)malloc(sizeof(struct ListNode));
pmove = head;
struct ListNode* prev = NULL;
struct ListNode* cur = head;
while (cur) //反转链表 存入prev
{
struct ListNode* next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
int b = 0;
while (pmove)// 遍历看是否相等
{
n++;
if (pmove->data == prev->data)
{
b++;
}
prev = prev->next;
pmove = pmove->next;
}
if (n == b)
return 1;
else
return 0;
}