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; }}