力扣 OJ 234. 回文链表

蹲街弑〆低调 提交于 2020-02-09 09:19:48

题目:

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

 

 

代码:

int GetLength(ListNode *p)//获取链表长度
{
	int ans = 0;
	while (p)
	{
		ans++;
		p = p->next;
	}
	return ans;
}

ListNode * Reverse(ListNode *p)//链表反转,返回新的head
{
	if (p == NULL)return p;
	ListNode * q1;
	ListNode * q2;
	q1 = p->next, p->next = NULL;
	while (q1)
	{
		q2 = q1->next, q1->next = p, p = q1, q1 = q2;
	}
	return p;
}

class Solution {
public:
	bool isPalindrome(ListNode* head) {
		if (head == NULL)return true;
		int length = GetLength(head);
		length = (length - 1) / 2;
		ListNode* p = head;
		while (length--)p = p->next;
		ListNode*q = p->next;
		p->next = NULL; //链表割开
		q = Reverse(q);//后半段反转
		p = head;
		while (q)
		{
			if (p->val != q->val)return false;
			p = p->next, q = q->next;
		}
		return true;
	}
};

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!