回文链表
题目:回文链表
给定一个链表的 头节点 head
,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
示例:
输入: head = [1,2,3,3,2,1]
输出: true
题解
方法一:双指针
class Solution1 {
public boolean isPalindrome(ListNode head) {
List<Integer> list=new ArrayList<>();
while(head!=null) {
list.add(head.val);
head=head.next;
}
int i,j;
for(i=0, j=list.size()-1; i<j; i++,j--) {
if(list.get(i)!=list.get(j)) {
return false;
}
}
return true;
}
}
方法二:快慢指针
/**
* 快慢指针找中间点,翻转,对比
*/
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode mid=middle(head);
mid=reverse(mid);
while (mid!=null) {
if (head.val!=mid.val) {
return false;
}
head=head.next;
mid=mid.next;
}
return true;
}
public ListNode middle(ListNode head)
{
ListNode slow=head;
ListNode fast=head;
while (fast.next!=null && fast.next.next!=null) {
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
public ListNode reverse(ListNode root) {
if(root==null || root.next==null) return root;
ListNode newHead=reverse(root.next);
root.next.next=root;
root.next=null;
return newHead;
}
}