回文链表

回文链表

十二月 10, 2018

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


示例1:

输入:1->2
输出:false

示例2:
输入:1->2->2->1
输出:true
解释:从左向右读,为-121。从右向左读,为121-。因此它不是一个回文数。

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解答:

/**
* 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 || head->next == NULL) return true;
int lenth = 0;
ListNode *ln1, *ln2, *ln3;
ln1 = ln2 = head;
ln3 = NULL;
//求出链表长度
while(ln1)
{
lenth ++;
ln1 = ln1->next;
}
cout << "lenth: " << lenth << endl;

//将链表的前一半元素逆序
for(int i = 0; i < lenth / 2; i++)
{
ln1 = ln2->next;
ln2->next = ln3;
ln3 = ln2;
ln2 = ln1;
}
//如果长度为奇数
//让ln2指向自己的next
//也就是指向从中间元素的后一个元素开始的链表
//ln3是从中间元素的前一个元素开始的逆序链表
if(lenth % 2 == 1) ln2 = ln2->next;
//开始比较ln2和ln3的每个元素知否相等,不相等则返回false
for(int i = 0; i < lenth / 2; i++)
{
if(ln2->val != ln3->val)
return false;
else
ln2 = ln2->next;ln3 = ln3->next;
}

return true;
}
};

复杂度分析

  • 时间复杂度:
  • 空间复杂度:
    images