js 判断回文数据

leetcode原题:234.回文链表
数据:[1,2,2,1]:
采用链表形式存储:

// 创建链表
var linkList = {
  val: 1,
  next: {
    val: 2,
    next: {
      val: 2,
      next: {
        val: 2,
        next: {
          val: 1,
          next: null
        }
      }
    }
  }
}

法一:通过函数调用栈的方式,反序判断

/**
 * 判断回文链表
 * 解决:通过闭包的形式保存头指针,并根据函数调用栈后进先出的机制,保存每次的值,再与头指针相向遍历来判断
 * 如果有两边判断时有一方为false则直接为假
 * @param head
 * @returns {boolean}
 */
var isPalindrome = function(head) {
// 使用let声明变量主要是为了防止外部引用(在非严格模式下)
  let left = head;
  function traverse(right) {
    if (right == null) return true;
    let res = traverse(right.next);
    // 只有当之前的值相等才再比较其值
    res = res && (right.val === left.val);
    left = left.next;
    return res;
  }
  return traverse(head);
};

法二:通过慢指针,快指针的方式,反转链表,使其一一匹配的方式

/**
 * 采用慢指针和快指针的方式,快指针用于判断奇偶以便构造慢指针
 * 慢指针用于指明当前所处后半部分的哪部分,用于反转后半部分,以至将反转之后的后半部分与之前的链表进行一一比较
 * @param head
 * @returns {boolean}
 */
var isPalindrome = function(head) {
  // 反转 slower 链表
  let right = reverse(findCenter(head));
  let left = head;
  // 只比前半部分
  while (right != null) {
    if (left.val !== right.val) {
      return false;
    }
    left = left.next;
    right = right.next;
  }
  return true;
};

// 如何找到这个慢指针:如果是偶数,则表示慢指针走了快表的一半距离,如果是块表,则比快表一半少一步,则需要再走一步
function findCenter(head) {
  let slower = head, faster = head;
  while (faster && faster.next != null) {
    slower = slower.next;
    faster = faster.next.next;
  }
  // 如果 faster 不等于 null,说明是奇数个,slower 再移动一格
  if (faster != null) {
    slower = slower.next;
  }
  return slower;
}

// 反转后半部分
function reverse(head) {
  let prev = null, cur = head, nxt = head;
  while (cur != null) {
    nxt = cur.next;
    cur.next = prev;
    prev = cur;
    cur = nxt;
  }
  return prev;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在JavaScript中,可以使用typeof运算符来判断数据类型。typeof通常用于判断基本数据类型,返回表示数据类型的字符串。例如,typeof 1会返回"number",typeof 'a'会返回"string",typeof true会返回"boolean",typeof undefined会返回"undefined",typeof null会返回"object",typeof {}会返回"object",typeof [1,2,3会返回"object",typeof new Fn()会返回"object",typeof new Array()会返回"object"。然而,typeof不能准确判断null的数据类型,null会被判断为"object"。此外,jQuery也提供了一系列工具方法来判断数据类型,例如jQuery.isArray()用于判断是否为数组,jQuery.isEmptyObject()用于判断是否为空对象,jQuery.isFunction()用于判断是否为函数等等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JS判断数据类型的5种方法](https://blog.csdn.net/weixin_45571121/article/details/120518849)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [js判断数据类型(全)](https://blog.csdn.net/qq_30136729/article/details/124090314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值