首页 > 其他分享 >面试必刷TOP101:13、判断一个链表是否为回文结构

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

时间:2023-10-26 11:01:11浏览次数:28  
标签:13 ListNode 回文结构 head next 链表 null public

一、题目

面试必刷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;
}
}

标签:13,ListNode,回文结构,head,next,链表,null,public
From: https://blog.51cto.com/u_16244372/8031043

相关文章

  • 03_反转链表
    反转链表给你单链表的头节点head,请你反转链表,并返回反转后的链表。力扣题目链接示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[]提示:链表中节点的数目范围是[0,5000]-5000<=Node.val<=5000思......
  • 单向链表学习总结
        直接上代码了,看着在代码上面建立的链表类,大概可以说出啥是链表,这个是单向链表的一个类,链表有它的链表头,还有结点,建立一个结点类,结点有它的值和指向,指向的代码实现直接赋值Node类,然后链表头也和结点有些关系,因此把头设为结点类,然后弄一个构造函数,方便链表初始化  ......
  • 13. 罗马数字转整数
    罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写做II,即为两个并列的1。12写做XII,即为X+II。27写......
  • 【洛谷 8601】 [蓝桥杯 2013 省 A] 剪格子
    #[蓝桥杯2013省A]剪格子##题目描述如图$1$所示,$3\times3$的格子中填写了一些整数。![](https://cdn.luogu.com.cn/upload/image_hosting/hsfjsi38.png)我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是$60$。本题的要求就是请你编程判定:对给定的$m\tim......
  • K 个一组翻转链表
    /***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=val;this.next=next;}*}......
  • 反转单向链表
    反转单向链表在编程语言中,链表是一种常用的数据结构。单向链表是一种线性数据结构,其中每个元素包含数据和一个指向下一个元素的指针。在某些情况下,可能需要反转单向链表。在Python中,可以使用迭代或递归方法来实现此操作。递归方法递归是一种在函数内部调用自身的编程技术。使用递归......
  • 面试必刷TOP101:12、单链表的排序
    一、题目publicclassSolution{/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@paramheadListNode类theheadnode*@returnListNode类*/publicListNodesortInList(ListNodehead){......
  • 灯塔--链表的学习
    双链表双链表的存储结构typedefstructDNode{ //定义双链表的节点类型 ElemTypedata; //数据域 structDNode*prior,*next;}DNode,*DLinkList;双链表的初始化boolInitDLinkList(DLinkList&L){DNodep=(DNode*)malloc(sizeof(DNode));if(L==NULL)retur......
  • FastAPI学习-13. 请求Header 参数
    前言你可以使用定义 Query, Path 和 Cookie 参数一样的方法定义Header参数。声明 Header 参数首先导入 Header:fromfastapiimportFastAPI,Header然后使用和Path, Query and Cookie 一样的结构定义header参数第一个值是默认值,你可以传递所有的额外验证或注释参......
  • 面试必刷TOP101:11、链表相加(二)
    一、题目二、题解反转链表:publicListNodeaddInList(ListNodehead1,ListNodehead2){//进行判空处理if(head1==null)returnhead2;if(head2==null){returnhead1;}//反转h1链表head1......