请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路一:可以遍历链表将值存入数组中,然后再在数组从前后进行回文判断。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head){
if(head == NULL || head->next == NULL) return true;
int val[5000];
int i = 0;
while(head){
val[i++] = head->val;
head = head->next;
}
int j = 0;
while( j < i ){
if(val[j++] != val[--i]){
return false;
}
}
return true;
}
思路二:首先用快慢指针找到链表的中间节点,然后将中间节点后的链表翻转,最后由第一个节点和中间节点开始判断是否回文。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *cur = head;
struct ListNode *pre = NULL;
while(cur != NULL){
struct ListNode *temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
struct ListNode* endOfIndex(struct ListNode* head){
struct ListNode *slow = head;
struct ListNode *fast = head;
while(fast->next != NULL && fast->next->next != NULL){
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
bool isPalindrome(struct ListNode* head){
if(head == NULL || head->next == NULL) return true;
struct ListNode *firtHead = endOfIndex(head);
struct ListNode *secondHead = reverseList(firtHead->next);
struct ListNode *p1 = head;
struct ListNode *p2 = secondHead;
while(p1 && p2){
if(p1->val != p2->val){
return false;
}
p1 = p1->next;
p2 = p2->next;
}
return true;
}