数据结构习题--回文链表

数据结构习题--回文链表

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

要求:

时间复杂度为O(n)

空间复杂度为O(1)

方法:反转后半链表

分析

因为要求使用O(1)空间复杂度,否则我们可以直接反转链表在一个一个比较,而因为不能开拓这种空间来存储链表,所以这里我们采取把原来的链表的后半部分反转,再与原来的链表的前半部分进行比较

  1. 先找到链表的中点
  2. 判断该链表奇偶,对慢指针进行处理
  3. 一一比较

代码

java 复制代码
package LinkList;

public class PalindromeList {
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    public class ListNode {
          int val;
          ListNode next;
          ListNode() {}
          ListNode(int val) { this.val = val; }
          ListNode(int val, ListNode next) { this.val = val; this.next = next; }
      }
    class Solution {
        public boolean isPalindrome(ListNode head) {
            // 初始快慢指针
            ListNode fast = head;
            ListNode slow = head;
            // 这里采用的是反转后半部分链表的方法,当然也可以反转前面链表,大概流程差不多
            // 快指针每次移动两格,慢指针每次一格,当快指针跑到结尾时,慢指针恰好在中间
            while (fast != null && fast.next != null){
                fast = fast.next.next;
                slow = slow.next;
            }
            // 原来的链表分为奇数和偶数情况
            // 当是奇数情况时,最中间那个元素不用判断回文,而慢指针指向最中间那个元素,所以单独往后移动一格慢指针
            // 比如:12345 结束循环时,快指针在5,慢指针在3,而我们其实只需要反转45就行
            // 对于偶数链表: 1234,结束循环时,快指针在(1234null)中的null,慢指针在3.我们需要反转34
            // 所以当快指针不为null时,说明链表是奇数,需要处理慢指针
            if (fast != null){
                slow = slow.next;
            }
            // 反转后面链表
            slow = reverse(slow);
            // 快指针重新指向头结点
            fast = head;
            // 逐一比较每个结点
            while (slow != null){
                if (fast.val != slow.val){
                    return false;
                }
                fast = fast.next;
                slow = slow.next;
            }
            return true;
        }
        public ListNode reverse(ListNode head) {
            ListNode nextNode = null;
            ListNode preNode = null;
            while (head != null){
                nextNode = head.next;
                head.next = preNode;
                preNode = head;
                head = nextNode;
            }
            return preNode;
        }
    }
}
相关推荐
LuminousCPP7 小时前
数据结构‑二叉树(二):二叉堆从零实现|Heap结构设计 + 建堆优化 + 堆排序深度解析
c语言·数据结构·笔记·二叉树
9 小时前
数据结构第一课:复杂度解析
数据结构
欧叶冲冲冲11 小时前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
_Narcissus_11 小时前
链表算法题和静态链表
数据结构·c++·笔记·算法·链表·ai·力扣
Lyyaoo.12 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
疯狂打码的少年13 小时前
【数据结构】八大排序算法对比总结(时间/空间/稳定性)
数据结构·笔记·算法
青 春 记 忆15 小时前
LeetCode 206. 反转链表|Python 解法详解
python·leetcode·链表
啊嘞嘞?18 小时前
力扣(回文链表)
算法·leetcode·链表
Awh-18 小时前
数据结构 第六章:哈希存储
数据结构·算法·哈希算法
TAN-90°-19 小时前
Deep Learning for Computer Vision——Recurrent Neural Networks
数据结构·人工智能·rnn·深度学习·神经网络·机器学习·计算机视觉