美文网首页
LeetCode:234. 回文链表数组求解

LeetCode:234. 回文链表数组求解

作者: 天降小纸箱 | 来源:发表于2021-01-06 18:30 被阅读0次

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

示例 1:

输入: 1->2
输出: false

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

实现思路:

  • 使用快慢两个指针,快指针每次走两个节点,慢指针每次走一个节点,fast走到链表末尾时,slow刚好走到正中间
  • 同时在slow走到中间的过程中使用数组将每一个节点的值存起来
  • 根据fast指针走到链表尾的情形判断为奇数还是偶数个
  • slow指针继续往前走直至链表尾,将后半段链表每一个节点与数组中寸起来的前半段的链表元素值一一对比

代码实现:

if (head == null || head.next == null) return true;
        ListNode L = new ListNode();
        L.next = head; // 增加一个头结点,方便计算
        ListNode slow = L, fast = L;
        int cnt = 0; // cnt 为链表长度的一半
        ArrayList<Integer> arrayList = new ArrayList<>();
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            cnt++;
            arrayList.add(slow.val);
        }
//        System.out.println(cnt + "\t" + arrayList.toString() + "\t" + arrayList.get(2));
        cnt = fast == null ? cnt -1 : cnt ; // 偶数项还是奇数项,如果是奇数项,先向后退一位
        slow = slow.next; // 后半段与前半段来进行回文判断
        while (slow != null) {
            if (arrayList.get(--cnt) != slow.val) return false;
            slow = slow.next;
        }
        return true;
    }

相关文章

网友评论

      本文标题:LeetCode:234. 回文链表数组求解

      本文链接:https://www.haomeiwen.com/subject/ltrooktx.html