📜  用循环检查链表是否为回文的 Javascript 程序(1)

📅  最后修改于: 2023-12-03 15:27:12.735000             🧑  作者: Mango

用循环检查链表是否为回文的Javascript程序
引言

链表是一种基本的数据结构,它是由节点组成的数据集合,每个节点包含一个数据项和指向下一个节点的指针。链表通常用于需要频繁插入和删除节点的情况。而回文是指一个字符串或者数字序列,正着读与反着读都一样,比如“level”、“1221”。本文将介绍如何使用循环检查链表是否为回文的 Javascript 程序。

代码实现

定义节点类

首先,我们需要定义一个节点类。它包含一个 value 属性,表示节点的值,以及一个 next 属性,表示节点指向的下一个节点。

class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

定义链表类

接着,我们需要定义一个链表类。它包含一个 head 属性,表示链表的第一个节点。

链表类还需要提供一个 append 方法,用于向链表末尾添加一个新节点。

class LinkedList {
  constructor() {
    this.head = null;
  }

  append(value) {
    const newNode = new Node(value);
    if (!this.head) {
      this.head = newNode;
    } else {
      let current = this.head;
      while (current.next) {
        current = current.next;
      }
      current.next = newNode;
    }
  }
}

判断链表是否为回文

下面就开始讲解如何使用循环检查链表是否为回文了。首先,我们需要一个 isPalindrome 方法,用于判断链表是否为回文。具体做法是将链表分为两半,并将其中一半翻转。然后,我们就可以比较两半是否相等。

class LinkedList {
  /* 省略部分代码 */
  
  isPalindrome() {
    // 将链表分为两半
    let slow = this.head;
    let fast = this.head;
    while (fast && fast.next) {
      slow = slow.next;
      fast = fast.next.next;
    }
    let leftHalf = this.head;
    let rightHalf = slow.next;
    slow.next = null;
    
    // 翻转右半部分
    let prev = null;
    let current = rightHalf;
    while (current) {
      const next = current.next;
      current.next = prev;
      prev = current;
      current = next;
    }
    rightHalf = prev;
    
    // 比较两半是否相等
    let left = leftHalf;
    let right = rightHalf;
    while (left && right) {
      if (left.value !== right.value) {
        return false;
      }
      left = left.next;
      right = right.next;
    }
    return true;
  }
}
结语

循环检查链表是否为回文的 Javascript 程序,需要将链表分为两半,并将其中一半翻转,然后比较两半是否相等。通过上述的程序实现,我们可以判断一个链表是否为回文。