• 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;
        }
    
  • 相关阅读:
    第四章
    第二章
    第三章
    第一章
    第十章心得
    第九章心得
    第八章心得
    第七章心得
    第六章心得
    第五章心得
  • 原文地址:https://www.cnblogs.com/xym4869/p/13037603.html
Copyright © 2020-2023  润新知