请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路:改变前半部分或者后半部分List的next指针。由于改变前半部分只需要一次遍历(用快、慢指针就能实现在第一次遍历的时候把前半部分的next指针反转)
/** * 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 boolean isPalindrome(ListNode head) { ListNode fast = head, slow = head, pre = null, tmp; while(fast.next!=null) { fast = fast.next.next; tmp = slow.next; slow.next = pre; pre = slow; slow = tmp; if(fast == null){ //双数 return check(pre, slow); } } //单数 return check(pre, slow.next); } private boolean check(ListNode l1, ListNode l2){ if(l1 == null) return true; if(l1.val != l2.val) return false; return check(l1.next, l2.next); } }