**
判断链表是否为回文链表(运用出栈入栈的方法)
**
思路:
1、找到中间节点
2、把中间节点以前的节点入栈
3、节点出栈,并于中间节点以后的节点比较,若是值相同就是回文结构
(栈的特点:后进先出)
若是链表个数为奇数,找到中间节点P的下一个节点P->next再做比较
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct node//链表
{
char data;
struct node* next;
}LinkList;
typedef struct//栈
{
char data[MAXSIZE];
int top;
}SeqStack;
int n;//全局变量
LinkList * CreaList()//创建新链表
{
LinkList* head,*r,*s;
char ch;
head = (LinkList*)malloc(sizeof(LinkList));
r = head;
ch = getchar();
n = 0;
while(ch !='#')
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = ch;
r->next = s;
r = s;
ch = getchar();
}
r->next = NULL;
return head;
}
int EmptyStack(SeqStack* s)//判断栈是否为空
{
if(s->top < 0)
return 1;
else
return 0;
}
int Push(SeqStack* s,char x)//入栈
{
if(s->top = MAXSIZE - 1)
return 0;
s->top++;
s->data[s->top] = x;
return 1;
}
char Pop(SeqStack* s)//出栈
{
char x;
x = s->data[s->top];
s->top--;
return x;
}
int PanDuanHW(LinkList* head)//判断是否为回文
{
LinkList* p = head->next;
int m = 0,t;
if(n % 2 == 1)//判断链表个数为奇数还是偶数
t = n / 2 + 1;//中间数
else
t = n / 2;
SeqStack* s,s1;
s = &s1;
s->top = -1;
while(p)
{
m++;
if(m <= n / 2)
Push(s,p->data);
else
{
if(n % 2 == 0 && m == t)
p = p->next;//跳过
if(!EmptyStack(s))
if(Pop(s) != p->data)
return 0;
}
p = p->next;
}
return 1;
}
void PrintList(LinkList* head)//打印链表
{
LinkList* p = head->next;
while(p)
{
printf("%c",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList* head;
printf("Build a new List...");
head = CreaList();
printf("Output the list:");
PrintList(head);
if(PanDuanHW(head))
printf("Yes\n");
else
printf("No\n");
return 0;
}