首页 > 其他分享 >BM13 判断一个链表是否为回文结构

BM13 判断一个链表是否为回文结构

时间:2022-12-29 14:45:59浏览次数:32  
标签:pre head slow BM13 回文结构 fast next 链表

题目描述

image

思路分析

  • 将链表分成两段,最后进行节点的比对
  • 问题:
    • 将链表均分为两端,可以使用快慢指针的方法,当fast指针运动到最后时,slow指针刚好到中点
    • 对于链表长度为奇数或是偶数时要做不同的处理
      -将后面一段链表进行反转,可以使用之前的反转链表部分的代码

代码参考

function isPail (head) {
  if (!head || !head.next) return true
  // write code here
  // 使用快慢指针找到链表的中间节点
  let fast = slow = head
  let first = second = null
  while (fast.next != null && fast.next.next != null) {
    fast = fast.next.next
    slow = slow.next
  }
  // 如果为奇数个,那么此时slow执行最中间的那个,
  // 如果为偶数个,那么此时slow指向中间的前一个
  // fast的next不为null,则为偶数个
  if (fast.next != null) {
    // 比如 1 2 3 4 5 6 此时 fast指向5,slow指向3
    first = slow.next
    // 将slow的next置空,也就是断开链表
    slow.next = null
    second = head
  } else {
    // 如果fast的next为null,则说明它是奇数个,比如1 2 3 4 5 fast指向5,slow为3
    first = slow.next
    // 此时我们需要裁成 1-2  4-5,也就是要找到slow的前驱结点
    // 找到slow的前驱结点pre
    let pre = head
    while (pre.next != slow) {
      pre = pre.next
    }
    // 将pre的next置为null,此时从head遍历结果为1-2
    pre.next = null
    second = head
  }

  first = reverseList(first)
  // 进行两条链表的比对
  while (first) {
    if (first.val != second.val) return false
    first = first.next
    second = second.next
  }
  return true

}
// 链表反转
const reverseList = (head) => {
  if (head == null) return head
  let pre = null, cur = head
  while (cur) {
    let temp = cur.next
    cur.next = pre
    pre = cur
    cur = temp
  }
  return pre
}

标签:pre,head,slow,BM13,回文结构,fast,next,链表
From: https://www.cnblogs.com/zx529/p/17012486.html

相关文章

  • BM14 链表的奇偶重排
    题目描述思路分析新建两个头节点,再创建一个索引,遍历head,将奇号位节点挂在node1下,偶号位节点挂在node2下,之后将节点连接在一起参考代码constoddEvenList=function......
  • BM11 链表相加(二)
    题目描述思路分析之前做过两数相加,与这道题类似,但是那道题的相加顺序是排好的,比如:1000+20两个链表的排序都是从最低位开始的0->0->0->1,0->2,此时我们直接相加就可......
  • BM9 删除链表的倒数第n个节点
    题目描述牛客原题代码参考//可以借助之前,追击的问题,借助返回倒数第k个节点的题的基础上functionremoveNthFromEnd(head,n){//writecodelet......
  • BM8 链表中倒数最后k个结点
    题目描述输入一个长度为n的链表,设链表中的元素的值为ai,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为0的链表。思路分析方法一:第一遍计算链......
  • 三、数据结构第三节——链表(2)
    三、数据结构第三节——链表(2)今天(好家伙,昨天忘记发了...)继续链表,嘤嘤嘤...今天尝试加入“分析”栏帮助梳理思路。二、合并链表先复习一下昨天那令人悲伤的例2T_......
  • [数据结构]单向链表的翻转(C语言)
    单向链表的翻转单向链表翻转思路假设链表是:1->3->5->∅,所要求得的链表是5->3->1->∅。只需要将每个节点的next指向其之前的一个节点即可。对于第一个节点,如果是头......
  • BM4-合并两个有序链表
    题目要求思路分析对于链表类的题,其实大部分有一个万能的方法,就是遍历一次链表,将他们的节点放到数组中,将节点的next置空,使用数组的各种方法去操作链表,之后再拼接链表。不......
  • 翻转链表
      代码如下/*structListNode{intval;structListNode*next;ListNode(intx):val(x),next(NULL){}};*/......
  • 数据结构第三节——链表(1)
    三、数据结构第三节——链表今天学链表~~~话不多说,上例题!一、小学生排序期末考试结束了,老师想请你帮忙统计全班同学的分数。已知班里有n个同学,老师会把n个同学......
  • ARM Linux中链表使用实例
          ......