题目
给定一个链表的头节点head,请判断该链表是否为回文结构。
例子: 1->2->1,返回true,1->2->2->1,返回true,1->2->3,返回false。
额外条件: 如果链表长为N,时间复杂度达到O(N),额外空间复杂度到达O(1)。
思路
拿到题目,我们先看一下数据状况,可以发现,回文结构,就是具有对称性的集合,
这边有3种思路。
①最简单的解法就是利用栈先进后出的特点。拿链表值的倒序和正序对比。空间复杂度到达O(N)。
isPalindrome1
②用快慢指针和栈,设置两个指针,遍历链表,慢的一次一步,快的一次两步。当快的走到底时,慢指针正好处于中心处,然后快指针停止移动,慢指针在后半程移动的同时把遍历的值放入栈中,最后把栈的值和链表的值遍历对比。空间复杂度到达O(N/2)
isPalindrome2
③用快慢指针,找到中间节点,然后慢指针遍历后半程的时候把后半段的链表反转。然后头尾同时开始遍历对比,最后把后半段还原。空间复杂度O(1)
isPalindrome3
下面看下具体的实现
实现
1 | public static class Node { |