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

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

给你一个单链表的头节点 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;
        }
    }
}
相关推荐
糖果店的幽灵1 小时前
Pandas DataFrame 数据结构详解
数据结构·pandas
起个破名想半天了3 小时前
算法与数据结构之Dijkstra算法
数据结构·dijkstra·单源最短路径·迪杰斯特拉算法
啦啦啦啦啦zzzz3 小时前
数据结构:哈夫曼编码
数据结构·c++·哈夫曼编码
ChillCoding3 小时前
更新中:C++ STL库,查找排序(基础算法),数据结构,数学算法,竞赛相关基础
数据结构·c++·算法
apcipot_rain4 小时前
计科八股20260606——二叉树、PCA、图深度学习、进程上下文、C语言预编译、文件读写、单精度浮点数
c语言·数据结构·算法·pca·图神经网络
落羽的落羽4 小时前
【项目】JsonRpc框架——开发实现2(业务层)
linux·数据结构·c++·人工智能·算法·json·动态规划
SHARK_pssm5 小时前
【数据结构——单链表】
数据结构·经验分享·笔记
lightqjx5 小时前
【算法】数据结构_并查集
数据结构·算法·并查集
小蒋学算法5 小时前
算法-掉落的方块-线段树
数据结构·算法
Brilliantwxx5 小时前
【算法从零到千】【8-15】滑动窗口
数据结构·算法