当前位置: 首页 > article >正文

【算法】判断一个链表是否为回文结构

问:

给定一个单链表的头节点head,请判断该链表是否为回文结构

例:

1 -> 2 -> 1返回true;1 -> 2 -> 2 -> 1返回true;15 -> 6 -> 15返回true

答:

笔试:初始化一个栈用来存放链表中右半部分的元素(快慢指针),弹栈的顺序是链表的逆序

public static class Node {
  public int value;
  public Node next;
  
  public Node(int data) {
    this.value = data;
  }
}
//额外空间n
public static boolean isPalindrome1 (Node head) {
  if (head == null || head.next == null) {
    return true;
  }
  Stack<Node> satck = new Stack<Node>();
  //为栈赋值做准备
  Node cur = head;
  //将链表的数据赋到栈中
  while (cur != null) {
    stack.push(cur);
    cur = cur.next;
  }
  //比较栈中的数据与链表中的数据
  while (head != null) {
    if (head.value != stack.pop().value) {
      return false;
    }
    head = head.next;
  }
  return true;
}
//额外空间n/2,快慢指针
public static boolean isPalindrome2 (Node head) {
  if (head == null || head.next == null) {
    return true;
  }
  Node slow = head.next;
  Node fast = head;
  while (fast.next != null && fast.next.next != null) {
    slow = slow.next;
    fast = fast.next.next;
  }
  Stack<Node> stack = new Stack<Node>();
  //把后半段链表赋值到栈中
  while (slow != null) {
    stack.push(slow);
    slow = slow.next;
  }
  //将弹栈元素与前半段链表中元素对比
  while (!stack.isEmpty()) {
    if (head.value != stack.pop().value) {
      return false;
    }
    head = head.next;
  }
  return true;
}

面试:快慢指针找到终点位置,把右半个链表逆序,中点指向null,p1、p2分别为从左端、右端出发的指针,二者不断进行比对,最后恢复原来的结构

//额外空间1
public static boolean isPalindrome3 (Node head) {
  if (head == null || head.next == null) {
    return true;
  }
  //找到链表中点
  Node slow = head;
  Node fast = head;
  while (fast.next != null && fast.next.next != null) {
    slow = slow.next;
    fast = fast.next.next;
  }
  //反转链表的后半段
  fast = slow.next;
  slow.next = null;
  Node n = null;
  while (fast != null) {
    n = fast.next;
    fast.next = slow;
    slow = fast;
    fast = n;
  }
  //将前半段与后半段比较
  n = slow;
  fast = head;
  boolean res = true;
  while (slow != null && fast != null) {
    if (slow.value != fast.value) {
      res = false;
      break;
    }
    slow = slow.next;
    fast = fast.next;
  }
  //把链表恢复原样
  slow = n.next;
  n.next = null;
  while (slow != null) {
    fast = slow.next;
    slow.next = n;
    n = slow;
    slow = fast;
  }
  return res;
}

http://www.kler.cn/a/502378.html

相关文章:

  • 【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解
  • 【深度学习】Pytorch:调度器与学习率衰减
  • 精通SCP命令:安全高效地进行文件传输
  • 语音技术与人工智能:智能语音交互的多场景应用探索
  • 信息科技伦理与道德3:智能决策
  • Centos9 + Docker 安装 MySQL8.4.0 + 定时备份数据库到本地
  • gcc编译过程中-L和-rpath的作用
  • 农业电商|基于SprinBoot+vue的农业电商服务系统(源码+数据库+文档)
  • 【电路设计】STM32硬件最小系统,Linux硬件最小系统,FPGA硬件最小系统
  • 接上篇基于Alertmanager 配置钉钉告警
  • 了解 Ansys Mechanical 中的网格方法:综合指南
  • Linux系统编程之线程优先级
  • LeetCode1170 比较字符串最小字母出现频次
  • C++ 鼠标轨迹算法 - 防止游戏检测
  • Kafka——两种集群搭建详解 k8s
  • C#格式化输出
  • 世优波塔数字人 AI 大屏再升级:让智能展厅讲解触手可及
  • 【Apache Doris】周FAQ集锦:第 29 期
  • VS Code 中,GitLens 和 Git Graph
  • 【大数据】Apache Superset:可视化开源架构
  • 如何更轻松的对React refs 的理解?都有哪些应用场景?
  • [Qt] 窗口 | 菜单栏MenuBar
  • springboot基于安卓的反诈APP
  • 代码随想录算法【Day20】
  • 【yum 无法使用】centos7 配置阿里云的 CentOS 镜像源
  • 解析OVN架构及其在OpenStack中的集成