面试必刷TOP101:13、判断一个链表是否为回文结构
  9ShvDtAiXXil 2023年11月02日 52 0

一、题目

面试必刷TOP101:13、判断一个链表是否为回文结构_快慢指针

二、题解

2.1 方法一使用list列表

  • 因为需要判断是否为回文结构,所以要比较头尾的数据,而链表无法随机查询数据,所以可以先将链表转换成list。

具体步骤

  • 首先初始化一个list列表;
  • 遍历链表,将链表中的值转移至list中;
  • 在list中通过比较头尾的值来判断链表是否为回文结构。
  • 代码如下:
import java.util.*;
/*
* public class ListNode {
*   int val;
*   ListNode next = null;
* }
*/
public class Solution {
  /**
   * 
   * @param head ListNode类 the head
   * @return bool布尔型
   */
  public boolean isPail (ListNode head) {
      // write code here
      // n==1,返回true
      if (head.next == null){
          return true;
      }
      List<Integer> nums = new ArrayList<Integer>();
      // 将链表转换成list
      while(head!=null){
          nums.add(head.val);
          head = head.next;
      }
      int i = 0;
      int j = nums.size()-1;
      while(i<j){
          // 不等则返回false
          // 这边有一个坑,如果不适用equals而使用!=的话,对于有负数的测试用例可能会无法通过。
          if (!nums.get(i).equals(nums.get(j))){
              return false;
          }
          ++i;
          --j;
      }
      return true;
  }
}

2.2 方法二快慢指针

方法一的空间复杂度为O(n),较大,可以使用快慢指针,快指针的速度为慢指针的两倍,当快指针到达链表尾部时,慢指针到达中间位置,将慢指针之后的部分进行反转,再与前半部分进行比较。

import java.util.*;
/*
* public class ListNode {
*   int val;
*   ListNode next = null;
* }
*/
public class Solution {
  /**
   * 
   * @param head ListNode类 the head
   * @return bool布尔型
   */
  public boolean isPail(ListNode head) {
  ListNode q= head, p= head;
  //通过快慢指针找到中点
  while (q != null && q.next != null) {
      q = q.next.next;
      p = p.next;
  }
  //如果q不为空,说明链表的长度是奇数个
  if (q != null) {
      p = p.next;
  }
  //反转后半部分链表
  p = reverse(p);

  q = head;
  while (p != null) {
      //然后比较,判断节点值是否相等
      if (q.val != p.val)
          return false;
      q = q.next;
      p = p.next;
  }
  return true;
}
//反转链表
public ListNode reverse(ListNode head) {
  ListNode prev = null;
  while (head != null) {
      ListNode next = head.next;
      head.next = prev;
      prev = head;
      head = next;
  }
  return prev;
}
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   110   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
9ShvDtAiXXil