判断一个链表是否为回文结构

判断一个链表是否为回文结构

【题目】 给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。 进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。

普通算法:运用栈,将数据域的内容放入栈中,若即将加入的元素与栈顶元素相同,则不加入该元素,并出栈。最后如果栈为空,是回文结构。注:1->2->1 奇数个节点特殊处理中间的节点不入栈。额外空间复杂度为o(n/2)。

bool is_Palindrome(Node*head){
	int num = 0;
	int mid = 0;
	stack<int>s;
	Node*temp = head;
	while (temp){
		num++;
		temp = temp->_next;
	}
	if (num == 1)
		return true;
	temp = head;
	mid = num / 2;
	while (mid--){
		s.push(temp->data);
		temp = temp->_next;
	}
	if (num % 2)
		temp = temp->_next;
	while (!s.empty())
	{
		if (temp->data == s.top()){
			s.pop();
			temp = temp->_next;
		}
		else
			return false;
	}
	return true;
		
}

进阶算法:找到中间的点,将链表的后半部分翻转,然后比较。注意最后将链表翻转回来不能破坏原来的结构。
找中点的方法:双指针p1和p2,p1每次走一步,p2每次两步,p2先走,p1后走,如果p2在走的过程中到达NULL,则,停止,返回p1的下一个结点。

bool is_Palindrome2(Node*head){
	int num = 0;
	int mid = 0;
	Node*temp = head;
	while (temp){
		num++;
		temp = temp->_next;
	}
	if (num == 1)
		return true;
	temp = head;
	mid = num / 2;
	while (mid--){
		temp = temp->_next;
	}
	if (num % 2)
		temp = temp->_next;
	reverse(temp);
	Node*help = temp;
	while (help){
		if (head->data == help->data){
			head = head->_next;
			help = help->_next;
		}
		else
			return false;
	}
	reverse(temp);
	return true;
}

总结:整理思路上没有什么说的,找中点有些更方便的技巧,比如用快慢指针,这里用的笨办法,先找结点的总个数。

发布了145 篇原创文章 · 获赞 12 · 访问量 9624

猜你喜欢

转载自blog.csdn.net/weixin_44997886/article/details/105318964