题目链接:https://leetcode.com/problems/palindrome-linked-list/
题目:
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
解题思路:
1、遍历第一次链表,获取它的长度
2、遍历第二次链表,将它后半段链表就地逆转
3、遍历第三次链表,q指针指向链表头,p指针指向后半段已逆转的链表头,边比较值,边向后遍历
注意:
小心空指针异常
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null)
return true;
ListNode p = head;
int n = 1;
while(p.next != null) {
p = p.next;
n ++;
}
p = head;
if(n % 2 == 0) {
int k = n / 2;
while(k != 1) {
p = p.next;
k --;
}
} else {
int k = n / 2;
while(k != 0) {
p = p.next;
k --;
}
}
ListNode q = p.next;
while(q != null && q.next != null) {
ListNode temp = q.next;
q.next = q.next.next;
temp.next = p.next;
p.next = temp;
}
q = head;
while(p.next != null) {
p = p.next;
if(q.val != p.val)
return false;
q = q.next;
}
return true;
}
}
21 / 21 test cases passed.
Status: Accepted
Runtime: 472 ms