• 【LeetCode】234. Palindrome Linked List


    描述:给一个单链表,判断是不是回文。

    分析:

    • 主要思路是,用两个指针遍历单链表,慢指针一步一个节点,快指针一步两个节点。当快指针到达表尾的时候,慢指针到达表中。(注意奇偶)
        ListNode slow = head;
        ListNode fast = head;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next; // 实际不是这样写的,还要复杂一点
            fast = fast.next.next;
        }
    
    • 在慢指针遍历前半部分的时候,把前半部分方向倒转,也就是说第三个节点的next指向第二个节点,类推。
        ListNode pre = null;
        ListNode next = slow.next;
        while (fast.next != null && fast.next.next != null) {
            pre = slow;
            slow = next;
            next = next.next;
            slow.next = pre;
        }
    
    • 当慢指针到达表中的时候,前半部分已经reverse,就可以从表中到两端判断是否回文。
        while (next != null) {
            if (slow.val != next.val) return false;
            slow = slow.next;
            next = next.next;
        }
        return true;
    

    完整实现:

    public boolean isPalindrome(ListNode head) {
        if (head == null) return true;
    
        ListNode slow = head;
        ListNode fast = head;
        ListNode pre = null;
        ListNode next = slow.next;
    
        while (fast.next != null && fast.next.next != null) {
            fast = fast.next.next; // 快指针一步两个节点
            pre = slow;
            slow = next; // 慢指针一步一个节点
            next = next.next;
            slow.next = pre; // 调转方向
        }
        if (fast.next == null) slow = slow.next; // 处理奇数,偶数不用处理
    
        while (next != null) {
            if (slow.val != next.val) return false;
            slow = slow.next;
            next = next.next;
        }
        return true;
    }
  • 相关阅读:
    [HNOI2003]消防局的设立
    [HNOI2003]操作系统(优先队列,堆排序)
    车站分级 (2013noip普及组T4)(树形DP)
    中国剩余定理
    楼房重建(分块优化)
    [HAOI2010]软件安装(树形背包,tarjan缩点)
    [USACO08NOV]时间管理Time Management(排序,贪心)
    没有上司的舞会(树形DP)
    选课(树形DP)
    miller rabin 素性测试
  • 原文地址:https://www.cnblogs.com/hippiebaby/p/5485277.html
Copyright © 2020-2023  润新知