判断单链表中的元素是否构成回文

本文介绍了一种使用栈辅助的双指针方法来检查单链表是否为回文结构。通过快慢指针找到中点,并利用栈保存前半部分元素进行对比,实现了高效的回文判断。
Check whether a singly linked list is a pallindrome.
Eg: 1->2->1 Ans: True

1->3->2->1 Ans: False

1.设置两个指针fast和slow,fast和slow指针一次移动两个和一个单位,同时将slow指针所指的元素入栈。

2.当fast指针指到空时,slow指针指向了中间点。

3.然后将slow指针所指的元素和栈顶元素比较,如果相等,slow指针继续移动,pop栈中的元素,继续比较指导不等,或栈为空。

用flag标志位为false表示元素总数为偶数个。如果为奇数个元素时,栈必须弹出中间的元素。

#include <iostream>
#include <stack>
struct node{
	int data;
	node* next;
	node(int eData,node* eNext){
		data = eData;
		next = eNext;
	}
};
bool isPanli(node*head){
	bool flag = false;//represent even
	std::stack<node*> stk;
	node* slow = head;
	node* fast = head;
	while (fast)
	{
		stk.push(slow);
		slow = slow->next;
		fast = fast->next;
		if (fast)
		{
			fast = fast->next;
		}
		else
			flag = true;//represent odd 奇数个元素
	}
	if (flag)//odd count elem , pop the middle elem
	{
		stk.pop();
	}
	while (stk.size())
	{
		if (stk.top()->data == slow->data)
		{
			stk.pop();
			slow = slow->next;
		}
		else
			return false;
	}
	return true;
}
int main()
{
	node* n5 = new node(1, NULL);
	node* n4 = new node(2, n5);
	node* n3 = new node(3, n4);
	//node* n2 = new node(3, n3);
	node* n1 = new node(2, n3);
	node* n0 = new node(1, n1);
	bool res = isPanli(n0);
	return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值