Leetcode0234. 回文链表
234. 回文链表
方法: 快慢指针
主要思路: 使用快慢指针,从第一个位置开始(不是从dummyHead开始),slow最后指向的是靠后中间位置;(类似于二分)
然后我们可以在慢指针移动过程中,将前面一半的链表反转;slow之前的所有节点都以反转next。
我们获得前后两段连接: l1 = prev
和 l2 = next
;
当链表为奇数个结点的时候,l2中节点个数比l1多一个;
后续我们只需要判断一下,当前fast指针是否为null,判断链表节点个数为奇数还是偶数,是奇数则后移一个位置;
在对两个链表是否相等进行进行判断;
时间复杂度:O(n)
/**
* 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;
// 两个都从第一个开始后移;slow指向靠后位置;
ListNode slow = head, fast = head;
ListNode prev = head;
while(fast != null && fast.next != null) {
// fast后移;
fast = fast.next.next;
ListNode next = slow.next;
slow.next = prev;
prev = slow;
slow = next;
}
//slow之前所有的节点都往前指了;
ListNode l1 = prev;
ListNode l2 = slow;
// 如果fast!= null 则是, 奇数个点,slow指向后面;
// 往后移动一位
if(fast != null) {
l2 = l2.next;
}
while(l2 != null) {
if(l1.val != l2.val)
return false;
l2 = l2.next;
l1 = l1.next;
}
return true;
}
}