leetcode算法234. 回文链表

88 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

一、题目描述:

234. 回文链表 - 力扣(LeetCode)

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例 1:

image.png

输入:head = [1,2,2,1]
输出:true

示例 2:

image.png

输入:head = [1,2]
输出:false

提示:

  • 链表中节点数目在范围[1, 10^5] 内
  • 0 <= Node.val <= 9

进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

二、思路分析:

这题说白了就是一个数在从后往前读每一个数字和从前往后读的每一个数字都相同,而我们需要做的只有两点,

一、反转该链表

二、比较原来链表和反转后链表的每一个值是否相同,相同则是回文数,否则就不是

本题唯一问题就是如何保证原链表不被改变,我们使用List集合存储该链表即可,如何反转该链表这里就不说了,挺基础的东西,这里只给思路。

三、AC 代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        List<Integer> list = new LinkedList<Integer>();
        int count = 0;
        ListNode dangqian = head;
        while(dangqian!=null) {
            list.add(dangqian.val);
            dangqian = dangqian.next;
            count++;
        }

        ListNode prev = null;
        ListNode current = head;
        ListNode next = null;
        while(current!=null) {
            next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        }
        int i = 0;
        while(i<count-1) {
            if(prev.val!=list.get(i)) {
                return false;
            }
            prev = prev.next;
            i++;
        }
        return true;
    }
}

四、总结:

这道题虽然是简单题,但考查了两个方面:
1.首先要找到前后半段的开头结点,如何找到中间结点?奇数偶数情况该如何处理
2.将后半段链表就地逆置

五、参考:

方法1:先将原来的链表进行逆转,然后将其和原来的链表进行同时从头遍历 - 回文链表 - 力扣(LeetCode)