题解 | #判断一个链表是否为回文结构#

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

https://www.nowcoder.com/practice/3fed228444e740c8be66232ce8b87c2f

/*
 * @Description:
 * @Version: 2.0
 * @Autor: jinglin.gao
 * @Date: 2022-09-14 17:43:42
 * @LastEditors: jinglin.gao
 * @LastEditTime: 2022-09-15 11:01:08
 */

// 双指针

// 快指针每次走的两个节点的长度
// 慢指针走一个节点的长度

// 在上面的基础上需要判断 链表的长度的的基数和偶数

/****
 * 1 2 3 2 1
 * 对于基数链表
 * 第一步
 * slow 1
 * fast 3
 *
 * slow 2
 * fast 5
 *
 * 此时的fast的.next 为null 证明到达链表尾部
 *
 *
 * 1,2,3,4
 *
 * slow 1
 *
 */

// 如果链表长度为奇数
/**
 *慢指针一次走一步  快指针一次走两步
 *快指针的next为null时 代表快指针走到了节点末尾
  此时的慢指针的next 则为奇数链表的中间节点
 */

//   当链表长度为偶数时
function isPail(head) {
  if (!head.next) return true;
  function ListNode(x) {
    this.val = x;
    this.next = null;
  }

  let fast = head;
  let slow = head;

  // 通过快指针来判断是否到达尾部
  while (fast && fast.next) {
    // 快指针一次走两步
    fast = fast.next.next;
    // 慢指针一次走一步
    slow = slow.next;
  }

  //   通过判断 fast是否有值 来进行链表长度 奇偶的判断

  //   如果不为null 则代表长度为基数的链表
  if (fast) {
    // 此时的慢指针的next 刚好指向链表的中间节点
    slow = slow.next;
  }

  // 此时slow代表回文链表的后半段,我们需要将这段链表进行反转 然后再从头跟原始链表进行比较

  // 结束条件就是  如果反转后的链表的每一项的值 都跟原始链表的 值相同 则证明 该链表为回文链表

  // 演化过程

  // 1 2 3  2 1

  // 找到后半段链表
  // 2 1

  // 反转链表
  // 1 2

  // 用反转后的链表与 原链表做对比

  // 反转:1 2
  // 原来:1 2 3 2 1

  // 2 1
  let current = slow;
  let reverseNodeList = null;
  let newNode = null;
  //   reverseNodeList = new ListNode(currentNode.val);
  while (current) {
    // 用原链表的值 创建一个新节点 作为反转链表的上一个节点
    newNode = new ListNode(currentNode.val);

    if (!reverseNodeList) {
      reverseNodeList = newNode;
    } else {
      newNode.next = reverseNodeList;
    }

    // 更新反转后链表的长度
    reverseNodeList = newNode;

    // 原链表长度要减少
    current = current.next;
  }

  //   反转后的链表 与 原链表进行比较
  fast = head;

  while (reverseNodeList) {
    if (reverseNodeList.val != fast.val) return false;
    reverseNodeList = reverseNodeList.next;
    fast = fast.next;
  }

  return true;
}

全部评论

相关推荐

06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
dao_yi:投了1000个左右,回消息的很少,要简历然后说过几天联系的都没有消息了,约面试的基本都是3000左右,足够在当地生活,最后去了一个武汉的3000,干了两天回来考研了,感觉这个行业加班是常态,看能不能考研上岸找个国企,或者大厂。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务