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?
反转链表
复杂度
时间 O(N) 空间 O(1)
思路
两个指针都从头出发,快指针每次两步,慢指针每次一步,这样快指针的下一个或下下个为空时,慢指针就在链表正中间那个节点了(如果链表有偶数个节点则在靠近头那侧的)。然后我们从慢指针的下一个开始,把后面的链表都反转(Reverse Linked List),然后我们再从头和从尾同时向中间前进,就可以判断该链表是不是回文了。
代码
public 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;
slow = slow.next;
}
// 记录第二段链表的第一个节点
ListNode secondHead = slow.next;
ListNode p1 = secondHead;
ListNode p2 = p1.next;
// 将第一段链表的尾巴置空
slow.next = null;
while(p1 != null && p2 != null){
ListNode tmp = p2.next;
p2.next = p1;
p1 = p2;
p2 = tmp;
}
// 将第二段链表的尾巴置空
secondHead.next = null;
// 依次判断
while(p1 != null){
if(head.val != p1.val) return false;
head = head.next;
p1 = p1.next;
}
return true;
}
}