请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解题思路
1.使用数组将所有的数读取出来再进行比较
代码如下:
```cpp
/**
* 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) {
ListNode* begin=head;
vector<int> nums;
while(begin!=NULL){
nums.push_back(begin->val);
begin=begin->next;
}//将每个数值提取出来
for(int i=0;i<nums.size()/2;i++){
if(nums[i]!=nums[nums.size()-1-i]){//进行比较
return false;
}
}
return true;
}
};
```
2.找出数组长度,新建链表从长度/2的地方开始,将后面链表翻转再与前面进行比较
代码如下:
```cpp
/**
* 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) {
int len=0;
for (ListNode *cur = head; cur != NULL; cur = cur->next) {//这样既能得到长度,也不会改变head的指针
len++;
}//找出长度
ListNode* mid=head;
for(int i=0;i<len/2;i++){
mid=mid->next;
}//找到指向中间数的指针
ListNode* newlist=NULL;
while(mid!=NULL){
ListNode* t=mid->next;
mid->next=newlist;
newlist=mid;
mid=t;
}//翻转后方链表
int j=0;
while(j!=len/2){
if(newlist->val!=head->val){
return false;
}
newlist=newlist->next;
head=head->next;
j++;
}//进行比较
return true;
}
};
```
3.快慢指针法
4.进出栈法