请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
**思路:**首先想到的是另建一个数组保存链表数据,转化为数组判断。而为了减小空间复杂度,应改为使用快慢指针。
首先,快指针到最后的时候,满指针的位置要么是正中间要么是正中间偏左一位;
接下来,把慢指针后面的部分反转;
最后,遍历对比前半部分和后半部分是否相同。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverlist(ListNode head){
ListNode h = null;
ListNode p = head;
ListNode r;
while(p != null){
r = p.next;
p.next = h;
h = p;
p = r;
}
return h;
}
public ListNode findhalf(ListNode head){
ListNode fast = head;
ListNode slow = head;
while(fast.next!=null && fast.next.next!=null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public boolean isPalindrome(ListNode head) {
ListNode half = findhalf(head);
ListNode reverhalf = reverlist(half.next);
ListNode p = head;
ListNode q = reverhalf;
while(q != null){
if(q.val != p.val){
return false;
}
q = q.next;
p = p.next;
}
half.next = reverlist(reverhalf);
return true;
}
}