Java教程

234. 回文链表 (JAVA)

本文主要是介绍234. 回文链表 (JAVA),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

 

思路:改变前半部分或者后半部分List的next指针。由于改变前半部分只需要一次遍历(用快、慢指针就能实现在第一次遍历的时候把前半部分的next指针反转)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode fast = head, slow = head, pre = null, tmp;
        while(fast.next!=null) {
            fast = fast.next.next;
            tmp = slow.next;
            slow.next = pre;
            pre = slow;
            slow = tmp;
            if(fast == null){ //双数
                return check(pre, slow);
            }
        }

        //单数
        return check(pre, slow.next);
    }

    private boolean check(ListNode l1, ListNode l2){
        if(l1 == null) return true;
        if(l1.val != l2.val) return false;
        return check(l1.next, l2.next);
    }
}

 

这篇关于234. 回文链表 (JAVA)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!