数据结构-栈&链表-判断单链表是否中心对称

一.算法思想

思路一:借助栈来实现本算法,首先将链表中前一半的元素进栈。在处理链表后一半元素时,当访问到链表的一个元素时,就从栈中弹出一个元素,并进行比较;若值相等,则继续往下比较,直到链表到尾。若这时栈是空栈,则可以得出该链表中心对称。若比较过程中有元素不相等或链表到尾时栈并不是空栈,则该链表为非中心对称(如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为奇数时,链表中心结点字符不必比较,移动链表指针到下一字符开始比较

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xulidanga

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值