LeetCode 234 回文链表和链表反转 | Java 刷题打卡

234 阅读1分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

题目描述

回文链表

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

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

进阶

你能否用时间复杂度是O(n){O(n)},空间复杂度是O(1){O(1)}来解决此题?

思路分析

像这种回文类的项目,很容易就想到用双指针解法来解答,我们先遍历一遍该链表,得出链表长度,然后再遍历到指定位置时,反转后面的链表,最后进行一一比较,判断是否为回文链表

代码展示

双指针解法,时间复杂度是O(n){O(n)},空间复杂度也是O(1){O(1)}

    // 234 回文链表
    public boolean isPalindrome(ListNode head) {  //1,2,3,4    //1,2,3
        if (head == null || head.next == null){
            return true;
        }
        ListNode p = head;
        int count = 0;
        while (p != null){
            p = p.next;
            count++;
        }
        p = head;
      	//对奇数和偶数分别进行处理
        int m = count/2;
        if (count % 2 != 0){
            m = m + 1;
        }
        while (p != null && m > 0){
            m--;
            p = p.next;
        }
        ListNode tempNode = reverseList(p);
        while (tempNode != null && head != null){
            if (tempNode.val != head.val){
                return false;
            }
            tempNode = tempNode.next;
            head = head.next;
        }
        return true;
    }

反转链表的解法如下:

   // 206 reverse list
    public ListNode reverseList(ListNode head) { //1,2,3
        ListNode prev = null;
        ListNode current = head;
        while (current != null){
            ListNode next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        }
        return prev;

    }

总结

在遇到回文字符串/链表等相关题目时,要优先考虑使用双指针解法,同时链表反转也是一个必须掌握的知识,在很多链表相关题目会用到。