回文链表——leetcode27

回文链表

题目:回文链表

给定一个链表的 头节点 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;
    }
}
posted @ 2022-01-20 12:22  言思宁  阅读(40)  评论(0编辑  收藏  举报