判断思想
第一步
借助栈表,让链表的前半部分压入栈中,然后在让链表的后半部分与栈表中的数据进行比较,如图
如果链表结点为奇数时,跳过中间结点
如果对你有帮助,点个赞呗
第二步
让链表后半部分结点分别于栈进行比较,如果发现其中一个结点不相同,则不是对称链表
实现代码
结构体
typedef struct StckL
{
char data;
struct StckL* Next;
}StckL, *SL;//链表结构体
函数功能代码
void SymmetryStck(SL L)
{
/*
参数:链表的首地址
函数功能:判断链表是否为对称链表例如:ABCBA,ABBC
*/
SL s = L->Next;
int Length=0;
Length = StckEmpty(L);//获取链表栈的长度
int half = (int)Length / 2;
char *LO=(char *)malloc(sizeof(char)*half);//根据链表长度定义栈表的大小
int i = 0;
while (i<half)//链表前半部分入栈
{
LO[i] = s->data;
s = s->Next;
i++;
}
if (Length%2==1)//如果链表节点个数为奇数则跳过中间结点
{
s = s->Next;
i++;
}
int flage = 0;//标记判断是否为对称链表
while (i < Length&& half>0)
{
if (s->data != LO[half-1])//进行比较
{
flage = -1;
break;//如果出现结点不相等,则立即跳出并改变标记
}
i++;
half--;
s = s->Next;
}
if (flage == -1)
{
printf("链表不是对称链表\n");
}
else
printf("链表是对称链表\n");
}