//判断回文链表
//1.方法一:利用栈结构,把链表倒进去,然后一一弹出比对
//2.方法二:快慢指针
//快慢指针+栈 减少了额外空间复杂度
bool Istrue(List head)
{
//假设是含有头节点的
head = head->next;
while (head== NULL|| head->next == NULL)
return true;
List p1 = head->next;
List p2 = head;
while (p1->next != NULL && p2->next->next != NULL)
{
p1 = p1->next;
p2 = p2->next->next;//快指针走两步,慢指针走一步
}
stack<int>s;
while (p1 != NULL)
{
s.push(p1->val);
p1 = p1->next;
}
while (!s.empty())
{
if (head->val == s.top())
{
s.pop();
head = head->next;
}
else
return false;
}
return true;
}
//只用栈
bool IsTrue(List head)
{
stack<int>s;
head = head->next;
while (head == NULL || head->next == NULL)
return true;
List p1 = head;
while (p1 != NULL)
{
s.push(p1->val);
p1 = p1->next;
}
p1 = head;
while (!s.empty())
{
if (p1->val == s.top())
{
p1 = p1->next;
s.pop();
}
else
return false;
}
return true;
}