返回一个布尔值判断是否为回文序列

不知道哪里不对,输入“1 2 2 1”输出却是“false”,而且检查了,逆置函数没错误的


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<stdbool.h>
#define LEN sizeof(struct LinkList)
struct LinkList
{
    int num;
    struct LinkList* next;
};
int main()
{
    bool IfPalind(struct LinkList* A);
    void Creat(struct LinkList* L);
    struct LinkList* L, * check;
    L = (struct LinkList*)malloc(LEN); L->next = NULL;
    Creat(L);
    if (IfPalind(L))
        printf("true\n");
    else
        printf("false\n");
    check = L->next;
    while (check)
    {
        printf("%d", check->num);
        check = check->next;
    }
    return 0;
}
void Creat(struct LinkList *L)
{
    char c='\0'; int x;
    struct LinkList* p, * rear;
    rear = L;
    while (c != '\n')
    {
        scanf_s("%d", &x);
        c = getchar();
        p = (struct LinkList*)malloc(LEN);
        p->num = x;
        p->next = NULL;
        rear->next = p;
        rear = p;
    }
    rear->next = NULL;
}
bool IfPalind(struct LinkList* A)
{
    struct LinkList* mid, * fast, * p, * q, * head_new, * cur;
    mid = fast = A->next;
    while (fast&&fast->next != NULL&&fast->next->next!=NULL)
    {
        mid = mid->next;
        fast = fast->next->next;
    }
    head_new = mid; p = mid->next; q = p->next; head_new->next = NULL;
    while (q)
    { 
        p->next = head_new->next;
        head_new->next = p;
        p = q;
        q = q->next;
    }
    p->next = head_new->next;
    head_new->next = p;
    cur = A; mid = mid->next;
    for(;mid;)
    {
        if (cur->num == mid->num)
        {
            cur = cur->next;
            mid = mid->next;
        }
        else
            break;
    }
    if (mid)
        return false;
    else
        return true;
}

我对IfPalind函数进行了修改,你可以对照一下。

bool IfPalind(struct LinkList* A)
{
    struct LinkList* mid, *fast, *p, *q, *head_new, *cur;
    mid = fast = A->next;
    while (fast&&fast->next != NULL && fast->next->next != NULL)
    {
        mid = mid->next;
        fast = fast->next->next;
    }

    //这里开始和你写的不一样
    //以head_new头结点对mid后面子串进行原地逆置
    head_new = (struct LinkList*)malloc(LEN);
    head_new->next = NULL;
    p = mid->next;
    while (p)
    {
        q = p->next;
        p->next = head_new->next;
        head_new->next = p;
        p = q;
    }
    //判断head_new后半段逆置部分和A前半段部分是否相同
    p = A->next; q = head_new->next;
    while (p&&q) {
        if (p->num != q->num) {
            return false;
        }
        p = p->next;
        q = q->next;
    }
    return true;
}