题目:设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx,xyyx,都是中心对称。
关键字:单链表+中心对称判断
思路 :
使用栈来判断链表中的数据是否中心对称。
原理:
栈是先进后出,所以前一半链表中元素可以实行“逆置输出”,此时和后一半元素进行比较,可以判断中心对称性
1)让链表的前一半元素一次进栈。
需要变量:
链表L,链表的长度n,遍历工作指针p;
字符栈S[n/2], 进栈小助手 i ;
2)在处理链表的后一半元素时,
当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素进行比较
3)从单链表前后两段中依次各取一个结点,按要求重排。
int dc(LinkList L,int n){//L是带头结点的n个元素单链表,本算法判断链表是否是中心对称
int i;
char s[n/2];//s字符栈
p=L->next;//p是链表的工作指针,指向待处理的当前元素
for(i=0;i<n/2;i++){//链表前一半元素进栈
s[i]=p->data;
p=p->next;
}
i--;//恢复最后的i值
if(n%2==1)//若n是奇数,后移一位,移过中心结点
p=p->next;
while(p!=NULL&&s[i]==p->data){//检测是否中心对称
i--;//i充当栈顶指针
p=p->next;
}
if(i==-1)//此时栈为空栈,说明所有后半链表中的元素都满足对称要求
return 1;//链表中心对称
else
return 0;//链表不中心对称
}