考研数据结构(每日一题)
题目:设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型,试设计算法判断该链表的全部n个字符是否中心对称,例如xyx、xyyx都是中心对称。
算法思想:
此题可以用栈来判断数据是否中心对称。
1.首先让链表的前一半元素依次进栈,当n为偶数时,前一半和后一半的个数相同;当n为奇数时,链表中心结点字符不比较,移动链表指针到下一字符开始比较
2.处理链表的后一半元素时,访问链表的一个元素后就从栈中弹出一个元素
3.两个元素进行比较,若相等,则将链表中的下一个元素与栈中再弹出的元素比较,依次至链尾
4.若此时是空栈,则得出链表中心对称
5.反之,当链表中的一个元素与栈中弹出的元素不等时,则不是中心对称
完整代码:
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 --;
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; //链表不中心对称
}
}