判断是否是回文型链表(C语言实现)

【题目描述】

请判断一个链表是否为回文链表。

【说明】

空链表是回文形式链表。

【输入描述】

输入包括两行,第一行1个数字n(n<50),表示链表节点数量,第二行有连续n个整数数字,表示节点的数据。

【输出描述】

输出只有ture或者false。是回文形式输出true,否则输出false。

【输入样例】

4

1 2 2 1

【输出样例】

true

代码实现

#include 

#include 

char a[50]={0},b[50]={0};

int i;

struct ListNode{

    int pos;

    struct ListNode *next;

};

//用于创建n个节点的链表

struct ListNode *Create(int n)

{

    struct ListNode *p1,*p2,*head=NULL;

    for(i=0;i

    {

        p1=(struct ListNode*)malloc(sizeof(struct ListNode));

        scanf("%d",&p1->pos);

        a[i]=p1->pos;

        if(i==0) head=p1;

        else p2->next=p1;

        p2=p1;

    }

    p2->next=NULL;

    return head;

}

//判断以head为头指针的链表是否是回文形式链表。是返回1,不是返回0

int isPalindrome(struct ListNode* head,int n)

{

    int flag;

    struct ListNode *p1=head,*p=head;

    i=0;

    while(head->next!=NULL)

    {

        while(p->next!=NULL)

        {

            p=p->next;

            p1=p;

        }

        b[i]=p->pos;

        p=head;

        while(p->next!=p1)p=p->next;

        p1->next=p;

        p1=p;

        p1->next=NULL;

        i++;

    }

    b[i]=p->pos;

    for(i=0;i

    {

        if(a[i]==b[i])

        {

            flag=1;

            continue;

        }

        else

        {

            flag=0;

            break;

        }

    }

    return flag;

}

int main()

{

    int n,t;

    struct ListNode *p;

    scanf("%d",&n);

    if(n!=0)

    {

        p=Create(n);

    t=isPalindrome(p,n);

    if(t==1)printf("true");

    else printf("false");

    }

    else printf("true");

    

  return(0);

}

你可能感兴趣的:(C语言题目实战,c语言)