一、题目描述:234. 回文链表(简单)
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
1、先计算链表长度,然后得到链表中间的位置mid,以及长度。
2、从head和mid指针开始递归,每下一层head = head->next,mid不变,直到head走到链表中间(注意分成奇数和偶数的区别),比较head->val和mid->val的值是否相等。然后递归返回mid->next,在上一层比较那一层的val和返回结果的val是否相等,如果不想等,则不是回文。如果是则继续递归返回,直到头指针和最后节点指针的值比较完之后仍然相等则是回文链表。否则中间出现一次不想等就不是回文链表。
三、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head == NULL)
return true;
if(head->next == NULL)
return true;
int count = 0;
ListNode * p = head;
while(p)
{
count++;
p = p->next;
}
int mid = (count+1)/2;
int mod = count%2;
p = head;
//cout<<"mid="<<p->val<<endl;
while(mid > 0)
{
mid --;
p = p->next;
}
bool is = true;
cout<<"mid="<<p->val<<endl;
cout<<"count+1="<<(count+1)/2<<endl;
cout<<"count-1="<<(count-1)/2<<endl;
ListNode * tmp = check(head,p,is,(count-1)/2,mod);
if(tmp != NULL)
if(tmp->val != head->val)
{
is = false;
}
return is;
}
ListNode * check(ListNode * head,ListNode* mid,bool & is,int count,int mod)
{
if(count == 0 &&mod ==1)
return mid;
if(count == 0 && mod == 0)
{
if(head->val == mid->val)
{
is = true;
}
else
{
is = false;
}
return mid->next;
}
ListNode * tmp = check(head->next,mid,is,count-1,mod);
if(tmp == NULL)
{
is = false;
}
if(head->val == tmp->val)
{
return tmp->next;
}
else
{
is = false;
return tmp->next;
}
}
};