题目:
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例 2:输入: 1->2->2->1 输出: true
解题思路如下:
用栈和队列结合解决这道题,将单链表中的数据同时入到栈和队列中,出栈的时候定义两个临时变量分别保存出栈的值和出队列的值,然后比较两个临时变量的是是否相等,如果相等就是回文链表,如果有一个不相等就不是回文链表。
代码:
bool isPalindrome(struct ListNode* head)
{
if (head == NULL || head->next == NULL)return true;
stack<int> st;
queue<int> que;
struct ListNode* p = head;
struct ListNode* q = head;
while (p)
{
st.push(p->val);
que.push(p->val);
p = p->next;
}
while (!st.empty())
{
int m = st.top(); st.pop();
int n = que.front(); que.pop();
if (m != n)
{
return false;
}
}
return true;
}
这种解法有个很大的缺点就是空间复杂度过高,为O(2*n),因为要用到一个栈和一个队列。因此这道题还能用更好的办法解决。