请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null|| head.next == null) {
return true;
}
ListNode fast = head;
ListNode slow = head;
while(fast.next!=null&&fast.next.next!=null){//注意!
fast = fast.next.next;//fast能被赋值就不停止
slow = slow.next;
}
//slow为中间节点;
slow = reverse2 (slow.next);
while(slow!=null){
if(head.val != slow.val){
return false;
}
head = head.next;
slow = slow.next;
}
return true;
}
//递归实现中间节点后续的链表反转
public ListNode reverse(ListNode head){
if(head.next == null) return head;
ListNode last = reverse(head.next);
//执行到这里时候已经把第二个到最后一个都反转完了;
head.next.next = head;//第二个节点的next反转连接到第一个
head.next = null;//第一个链接到null;
return last;
}
//迭代方式反转链表
public ListNode reverse2(ListNode head){
if(head == null || head.next == null) return head;
ListNode tmp = null;
ListNode pre = null;
while(head.next!=null){
// null, 1, 2;
tmp = head.next;//2
head.next = pre;
pre = head;
head = tmp;
}
head.next = pre;
return head;
}
}