一.算法思想
思路一:借助栈来实现本算法,首先将链表中前一半的元素进栈。在处理链表后一半元素时,当访问到链表的一个元素时,就从栈中弹出一个元素,并进行比较;若值相等,则继续往下比较,直到链表到尾。若这时栈是空栈,则可以得出该链表中心对称。若比较过程中有元素不相等或链表到尾时栈并不是空栈,则该链表为非中心对称(如xxyxx中心对称)
思路二:将单链表的元素全部进栈,然后依次与单链表进行比较,直到比较到链表L为止,该算法与第一个算法相比实现起来较简单,但需要扫描两次单链表,效率较低。
二.源代码
//判断链表数据是否中心对称
bool Central(List list) {
//创建一个栈,并进行初始化
PtrToSNode SqStack = new SNode;
InitStack(SqStack);
int n = 0;//n用来记录链表有多少个结点
int i = 0;
Node p;
p = list->Next; //p为工作指针,初始化为第一个结点
while (p!=NULL) { //确定n的数值
n++;
p = p->Next;
}
p = p->Next; //p为工作指针,初始化为第一个结点
for (i = 0; i < n / 2;i++) { //链表前一半元素进栈
Push(SqStack,p->Data);
p = p->Next;
}
i--; //恢复最后的i值
if (n % 2 == 1) { //若n是奇数,后移过中心结点
p = p->Next;
}
while (p!=NULL&&p->Data==Pop(SqStack)) { //检测是否中心对称
p = p->Next;
}
if (SqStack->top==-1) { //链表中心对称
return true;
}
else //链表不中心对称
return false;
}
注:当长度N为偶数时,前一半与后一半个数相同;当N为奇数时,链表中心结点字符不必比较,移动链表指针到下一字符开始比较