1. 回文链表

题目如下:leetcode-234

请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目确实很简单,但是自己在解题途中发生了一个错误,就是自己知道要翻转后半部分的链表,但是却没有在快慢指针的时候限定快指针的结束位置不能够为null,最后导致每次翻转被翻转的一定会少一个节点!就导致了解题错误!翻转若是null传入,表示不用翻转,违背自己初衷

2. 解题&代码

大致解题主要是注意翻转后半部分就好,翻转可以采用递归翻转和非递归方式翻转!现在面试中考察的多的是递归翻转!

代码如下:

public boolean isPalindrome(ListNode head) {
        if (head == null || head.next == null) return true;
        ListNode fast = head;
        ListNode slow = head;
        // 这里只需要将fast节点的停止条件前移即可
        while (fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        // 翻转后部链表
        fast = slow.next;
        slow.next = null;
        slow = head;
        fast = reverseNode(fast);
        // 开始比对,只要不相等就返回false
        while (fast != null) {
            if (slow.val != fast.val) return false;
            fast = fast.next;
            slow = slow.next;
        }
        return true;
    }

    /**
     * 非递归版本
     */
    public ListNode reverseNode(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode p = null;
        while (head != null) {
            ListNode temp = head.next;
            head.next = p;
            p = head;
            head = temp;
        }
        return p;
    }

    /**
     * 递归版本
     */
    public ListNode recurseNode(ListNode head){
        if(head == null || head.next == null) return head;
        ListNode node = recurseNode(head.next);
        head.next.next = head;
        head.next = null;
        return node;
    }

3. 小结

题目很简单,但是自己还是出现了点小问题,说明思考的还是不够细致!还需要继续加油!

keep thinking, keep coding! 2020-10-23写于南京