zoukankan      html  css  js  c++  java
  • LeetCode——回文链表

    Q:请判断一个链表是否为回文链表。
    示例 1:
    输入: 1->2
    输出: false
    示例 2:
    输入: 1->2->2->1
    输出: true

    A:
    1.reverse以后对比。
    因为这里是递归reverse,所以之前要先复制一个原链表。

        public boolean isPalindrome(ListNode head) {
            if (head == null || head.next == null)
                return true;
            ListNode node = head.next;
            ListNode head1 = new ListNode(head.val);
            ListNode temp = head1;
            while(node!=null){
                int val = node.val;
                temp.next = new ListNode(val);
                temp = temp.next;
                node = node.next;
            }
            ListNode head2 = reverse(head);
            ListNode node1 = head1;
            ListNode node2 = head2;
            while (node1 != null) {
                if (node1.val != node2.val)
                    return false;
                node1 = node1.next;
                node2 = node2.next;
            }
            return true;
        }
    
        private ListNode reverse(ListNode head) {
            if (head == null || head.next == null)
                return head;
            ListNode node = reverse(head.next);
            head.next.next = head;
            head.next = null;
            return node;
        }
    

    2.双指针
    主要是找到中点再reverse,我觉得这样就没什么意思了……

        private ListNode reverse(ListNode head) {
            if (head == null || head.next == null)
                return head;
            ListNode node = reverse(head.next);
            head.next.next = head;
            head.next = null;
            return node;
        }
    
        public boolean isPalindrome(ListNode head) {
            if (head == null || head.next == null)
                return true;
            ListNode slow = head;
            ListNode fast = head.next;
            while (fast != null && fast.next != null) {//找到中点,如果是偶数,为前一个点
                slow = slow.next;
                fast = fast.next.next;
            }
            fast = reverse(slow.next);
            slow.next = null;//cut前后两段
            slow = head;
            while(fast!=null){//这里一定要是fast的长度,fast是后半段,slow是前半段,若为奇数长度链表,slow更长
                if(slow.val!=fast.val)
                    return false;
                slow = slow.next;
                fast = fast.next;
            }
            return true;
        }
    
  • 相关阅读:
    github上Devstack的一些变动,截至8.20
    Tokyo Tyrant(TTServer)系列(二)-启动參数和配置
    云方案术语
    四大桌面云显示协议解析
    rdesktop -u qinrui -p 'Aa7788..' 192.168.3.117 -a 32 -g workarea
    IOS开发之block应用
    怎样用EA设计ER图
    使用Jsoup解析和操作HTML
    Speak a Good Word for SB
    LeetCode234_PalindromeLinkedList (推断是否为回文链表) Java题解
  • 原文地址:https://www.cnblogs.com/xym4869/p/13037603.html
Copyright © 2011-2022 走看看