请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
先遍历该链表,得到链表总长度,由此可得中间结点的位置.
重新遍历链表至中点为止,并用栈存储各结点的val值.
从中点向后继续遍历,指针每向后一步,弹出栈顶的值与指针当前结点的val值比对,若相同,则继续,若不相同,则不是回文链表,退出循环,返回false.
遍历完后,则前半链表与后半链表结点依次反向对应,则是回文链表,返回true.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int isPalindrome(ListNode* head)
{
long length = 0;
ListNode* temp = head;
while(temp != nullptr)//求出链表的总长度
{
length ++;
temp = temp -> next;
}
int half = length / 2;
temp = head; //temp重新指向头结点,重新开始遍历
stack<int> stack;
for(int i = 0; i < half; i++)
{
stack.push(temp -> val);
temp = temp -> next;
}
bool palindrome = true;
switch (length % 2)
{
case 0:
{
while(palindrome && temp != nullptr)
{
int tmp = stack.top();
stack.pop();
if(tmp != temp -> val)
{
palindrome = false;
}
temp = temp -> next;
}
break;
}
case 1:
{
temp = temp -> next; //列表最中间单独的一个元素不处理
while(palindrome && temp != nullptr)
{
int tmp = stack.top();
stack.pop();
if(tmp != temp -> val)
{
palindrome = false;
}
temp = temp -> next;
}
break;
}
}
return palindrome;
}
};
是个方法,但时间空间复杂度均为O(n),应该还有更高效的方法.
也可用快慢指针法实现.