LeetCode练习题 — 回文链表(Java)

别来无恙 提交于 2020-02-29 23:13:28

题目描述:

判断一个链表是否为回文链表。(回文链表即翻转前后相同的链表)

示例:

在这里插入图片描述
思路:

判断一个链表是否为回文链表,可以认为是一个比较链表前半部分和后半部分是否相同的问题,可以分三步看:

1、先找到原链表的中间结点
2、将链表的后半部分逆置
3、比较两个链表的每个结点,相同返回true,不同返回false;在这里有一个问题,若原链表的结点个数为奇数,那么新的两个链表结点个数相同,但是若是原链表的结点个数为偶数,那么前半部分形成的链表比后半部分形成的新链表多一个结点(如下图),所以在进行循环比较时,一后半部分形成的链表为条件判断循环是否继续

在这里插入图片描述

代码:

/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) { val = x; }
* }
*/
class Solution {
    public int size(ListNode head) {
        int size = 0;
        ListNode cur = head;
        while (cur != null) {
            size++;
            cur = cur.next;
        }
        return size;
    }
    public boolean isPalindrome(ListNode head) {
        // 1. 先找到 A 链表的中间节点
        int size = size(A);
        int steps = size / 2;
        ListNode B = A;
        for (int i = 0; i < steps; i++) {
            B = B.next;
        }
        // 上面的循环结束后, B 就指向 A 链表的中间位置了
        // 2. 从 B 开始对后面的链表进行逆置操作
        ListNode prev = null;
        ListNode cur = B;
        while (cur != null) {
            ListNode next = cur.next;
            if (next == null) {
                // 说明此时的 cur 已经是链表的最后一个节点了, 更新头结点的位置
                B = cur;
            }
            cur.next = prev;
            prev = cur;
            cur = next;
        }
        // 3. 分别从 A 和 B 出发, 来依次对比两个链表的元素是否对应相等.
        // 如果链表的长度为 奇数 个, 那 A 和 B 长度是相同的, 此时无影响
        // 如果链表的长度为 偶数 个, 那 A 的长度比 B 要长一个元素, 就需要注意遍历的时候循环结束条件
        // 要以 B 为基准
        while (B != null) {
            if (A.val != B.val) {
                // 对应元素不同, 说明不是回文
                return false;
            }
            A = A.next;
            B = B.next;
        }
        return true;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!