首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

实现一个函数来检查链表是否是回文--没有递归,没有堆栈,没有反向

实现一个函数来检查链表是否是回文,可以通过以下步骤进行:

步骤1:定义链表节点的数据结构。一个链表节点包含一个值和一个指向下一个节点的指针。

步骤2:定义一个函数来创建链表。该函数接收一个数组作为参数,将数组中的元素逐个添加到链表中,并返回链表的头节点。

步骤3:定义一个函数来检查链表是否是回文。该函数接收链表的头节点作为参数。

步骤4:初始化两个指针,一个指向链表的头节点,另一个指向链表的中间节点。

步骤5:从链表的头节点开始,遍历链表,同时遍历到中间节点。在遍历过程中,将前半部分链表的节点值依次存储到一个临时数组中。

步骤6:遍历到中间节点后,将链表剩余部分的节点值与临时数组中的值进行比较,如果不相等,则链表不是回文,返回false。

步骤7:如果链表的所有节点值都与临时数组中的值相等,则链表是回文,返回true。

以下是一个示例的实现代码(使用JavaScript语言):

代码语言:txt
复制
// 定义链表节点的数据结构
class ListNode {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

// 创建链表
function createLinkedList(arr) {
  let head = null;
  let prev = null;

  for (let i = 0; i < arr.length; i++) {
    let node = new ListNode(arr[i]);

    if (!head) {
      head = node;
    } else {
      prev.next = node;
    }

    prev = node;
  }

  return head;
}

// 检查链表是否是回文
function isPalindrome(head) {
  // 快慢指针找到链表中间节点
  let slow = head;
  let fast = head;

  while (fast && fast.next) {
    slow = slow.next;
    fast = fast.next.next;
  }

  // 将前半部分链表的节点值存储到临时数组中
  let tempArr = [];
  let curr = head;

  while (curr !== slow) {
    tempArr.push(curr.value);
    curr = curr.next;
  }

  // 链表节点个数为奇数时,中间节点不需要比较
  if (fast) {
    slow = slow.next;
  }

  // 比较链表剩余部分的节点值与临时数组中的值
  while (slow) {
    if (slow.value !== tempArr.pop()) {
      return false;
    }
    slow = slow.next;
  }

  return true;
}

// 测试链表是否是回文
let arr = [1, 2, 3, 2, 1];
let head = createLinkedList(arr);
let isPalin = isPalindrome(head);
console.log(isPalin); // true

这个函数的实现避免了使用递归、堆栈和反向的操作,通过快慢指针来找到链表的中间节点,然后将前半部分链表的节点值存储到一个临时数组中,最后将剩余部分的节点值与临时数组中的值进行比较,以确定链表是否是回文。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET面试题系列 - IEnumerable的派生类

自己实现一个栈还是比较简单的,可以借助List进行存储。 Stack应用一例:测试回文字符串 所谓回文指向前和向后拼写都完全一样的字符串。...例如,“dad”、“madam”以及“sees”都是回文,而“hello”就不是回文检查字符串是否回文的方法之一就是使用堆栈。常规算法逐个字符的读取字符串,并且在读取时把每个字符都压入堆栈。...这会产生反向存储字符串的效果。 下一步就是把堆栈内的每一个字符依次出栈,并且把它与原始字符串从开始处的对应字母进行比较。如果在任何时候发现两个字符不相同,那么此字符串就不是回文,同 时就此终止程序。...向链表中插入一个新的节点的渐进时间取决于链表是否有序的。如果链表不需要保持顺序,则插入操作就是常量时间O(1),可以在链表的头部添加新的节点。...T>) 查找:O(N) 关于链表的算法面试题可谓五花八门,实现一个单向或双向链表,并实现它们的若干主要功能,一个极好的编程练习。

1.7K20

如何高效判断回文链表

预计阅读时间:7 分钟 今天聊聊如何判断一个链表是不是回文链表。...下面扩展这一最简单的情况,来解决:如何判断一个「单链表」是不是回文。...那么最简单的办法就是,把原始链表反转存入一条新的链表,然后比较这两条链表是否相同。关于如何反转链表,可以参见前文 递归思维:k 个一组反转链表。...实际上就是把链表节点放入一个栈,然后再拿出来,这时候元素顺序就是反的,只不过我们利用的递归函数的堆栈而已。 当然,无论造一条反转链表还是利用后续遍历,算法的时间和空间复杂度都是 O(N)。...三、最后总结 首先,寻找回文从中间向两端扩展,判断回文从两端向中间收缩。 对于单链表,无法直接倒序遍历,可以造一条新的反转链表,可以利用链表的后序遍历,也可以用栈结构倒序处理单链表

87410

如何判断回文链表

下面扩展这一最简单的情况,来解决:如何判断一个「单链表」是不是回文。...一、判断回文链表 输入一个链表的头结点,判断这个链表中的数字是不是回文: /** * 单链表节点的定义: type ListNode struct { val int next...那么最简单的办法就是,把原始链表反转存入一条新的链表,然后比较这两条链表是否相同。关于如何反转链表,可以参见前文「递归操作链表」。...实际上就是把链表节点放入一个栈,然后再拿出来,这时候元素顺序就是反的,只不过我们利用的递归函数的堆栈而已。 ? 当然,无论造一条反转链表还是利用后序遍历,算法的时间和空间复杂度都是 O(N)。...三、最后总结 首先,寻找回文从中间向两端扩展,判断回文从两端向中间收缩。对于单链表,无法直接倒序遍历,可以造一条新的反转链表,可以利用链表的后序遍历,也可以用栈结构倒序处理单链表

86920

LeetCode No.234 回文链表

一、题目描述 给你一个链表的头节点 head ,请你判断该链表是否回文链表。如果,返回 true ;否则,返回 false 。...有两种常用的列表实现,分别为数组列表和链表。如果我们想在列表中存储值,它们如何实现的呢?...访问某个特定索引的节点需要 O(n)的时间,因为要通过指针获取到下一个位置的节点。 确定数组列表是否回文很简单,我们可以使用双指针法来比较两端的元素,并向中间移动。...然而同样的方法在链表上操作并不简单,因为不论正向访问还是反向访问都不是 O(1)。而将链表的值复制到数组列表中 O(n),因此最简单的方法就是将链表的值复制到数组列表中,再使用双指针法判断。...在 Python 中,很容易构造一个列表的反向副本,也很容易比较两个列表。而在其他语言中,就没有那么简单。因此最好使用双指针法来检查是否回文

41740

【剑指Offer专题】链表系列:从尾到头打印链表、反转链表回文链表、合并两个排序的链表(C++和Python实现

回文链表 请判断一个链表是否回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 1、算法思路 复制链表值到数组列表中。...使用双指针法判断是否回文。 遍历链表将值复制到数组列表中。用 currentNode 指向当前节点。...在 Python 中,很容易构造一个列表的反向副本,也很容易比较两个列表。因此最好使用双指针法来检查是否回文。...1、思路 先判断输入的链表是否为空的指针。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接返回第一个链表。如果两个链表都是空链表,合并的结果得到一个链表。...两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针即可。使用递归就可以轻松实现

84510

LeetCode 热题 HOT 100题解 (easy级别)

堆栈具有栈顶和栈底之分。所谓入栈,就是将元素压入(push)堆栈;所谓出栈,就是将栈顶元素弹出(pop)堆栈。先入栈的一定后出栈,所以可以利用堆栈来检测符号是否正确配对。...https://leetcode-cn.com/problems/intersection-of-two-linked-lists 方法 1:暴力法 思路 对于链表 A 的每个节点,都去链表 B 中遍历一遍找看看有没有相同的节点...return true // 循环结束也没有返回false,说明回文 } 543.二叉树的直径 https://leetcode-cn.com/problems/diameter-of-binary-tree...) // 递归,获取右子树的深度 let right = depth(rootNode.right) /* 关键点1 L+R+1的公式如何而来?...root1) { return root1 } else if (root1 && root2) { root1.val = root1.val + root2.val //递归合并每一个节点

1.1K23

编程(30)-泛IO:Free Monad-Monad生产线

Trampoline类型一种数据结构,它的设计思路是以heap换stack:对应传统递归算法运行时在堆栈上寄存程序状态,用Trampoline进行递归算法时程序状态保存在Trampoline的数据结构里的...那么这个函数无法实现函数组合(function composition)。transfer函数就不是一个编程人员该使用的函数了。...这个程序prg有缺陷的:无法实现交互。好像如果能把Ask指令存放到一个临时变量里就可以达到目的了。...注意Bind状态循环递归的。...主要目的解决泛算法中不可避免的堆栈溢出问题。如果我们用Free Monad来解决IO问题的话,堆栈溢出问题也是无法避免的。我们应该考虑在Free Monad里使用Trampoline类型。

1.1K70

程序员必备的50道数据结构和算法面试题

要解决链表问题,你就必须了解递归的相关知识,因为链表一种递归的数据结构。如果你从链表中去掉一个节点, 剩下的数据结构仍然链表,因此, 许多链表问题有比遍历更简单的递归解决方案....字符串相关问题 与数组和链表数据结构一起,字符串编程工作面试中的另一个热门话题。我从未参加过没有问过基于字符串相关问题的编码面试。...以下编程求职面试中常见的字符串编程问题: 1、如何输出字符串中的重复字符? 2、如何判断两个字符串是否互为回文? 3、如何从字符串中输出第一个不重复字符? 4、如何使用递归实现字符串反转?...11、如何判断两个字符串是否互为旋转? 12、如何判断给定字符串是否回文?...7、基数排序算法如何实现的? 8、在不使用第三个变量的前提下如何交换两个数? 9、如何检查两个矩形是否重叠? 10、如何设计一个自动售货机?

3.2K11

程序员必备的50道数据结构和算法面试题

要解决链表问题,你就必须了解递归的相关知识,因为链表一种递归的数据结构。如果你从链表中去掉一个节点, 剩下的数据结构仍然链表,因此, 许多链表问题有比遍历更简单的递归解决方案....字符串相关问题 与数组和链表数据结构一起,字符串编程工作面试中的另一个热门话题。我从未参加过没有问过基于字符串相关问题的编码面试。...以下编程求职面试中常见的字符串编程问题: 1、如何输出字符串中的重复字符? 2、如何判断两个字符串是否互为回文? 3、如何从字符串中输出第一个不重复字符? 4、如何使用递归实现字符串反转?...11、如何判断两个字符串是否互为旋转? 12、如何判断给定字符串是否回文?...7、基数排序算法如何实现的? 8、在不使用第三个变量的前提下如何交换两个数? 9、如何检查两个矩形是否重叠? 10、如何设计一个自动售货机?

4.2K20

资源 | 从算法到数据结构,百道面试问题实现答案集合

选自GitHub 作者:Sherali Obidov 机器之心编译 参与:李亚洲、微胖、蒋思源 该资源算法、数据结构以及面试问题解决方案的集合,里面的 repository 包含了我对常见算法问题的解答以及数据结构的实现...(linked list) 单链表实现:http://suo.im/2n3Kzr 双向链表实现(Doubly Linked List):http://suo.im/1y98CP 删除链表中的结点:http...://suo.im/41ZByL 回文链表(Palindrome Linked List):http://suo.im/3OWugt 反向链表(Reverse Linked List):http://suo.im...&队列(Stack & Queue) 最小堆栈:http://suo.im/4FiVlB 最小队列:http://suo.im/3KEtsq 使用队列实现堆栈:http://suo.im/D5r2s 使用堆栈实现队列...Needle and Haystack:http://suo.im/lXoT4 词内换行(word break):http://suo.im/3BIxnZ 数据结构 树(Trees) 二叉搜索树(递归

68860

小白学算法-数据结构和算法教程: 反转链表

辅助空间: O(1) 使用递归反转链表: 这个想法使用递归到达链表的最后一个节点,然后开始反转链表。 插图: 请按照以下步骤解决问题: 将链表分为两部分——第一个节点和链表的其余部分。...85 15 4 20 反向链表 20 4 15 85 时间复杂度: O(N),每个节点访问一次辅助空间: O(N),函数调用栈空间 通过尾递归方法反转链表: 这个想法维护三个指针previous...下面上述方法的实现: #简单的尾递归Python程序,用于反转链表 #节点类 class Node: # 用于初始化节点对象的构造函数 def __init__(self, data):...辅助空间: O(N),函数调用栈空间 使用Stack反转链表: 这个想法将所有节点存储在堆栈中,然后创建一个反向链表。 请按照以下步骤解决问题: 将节点(值和地址)存储在堆栈中,直到输入所有值。...下面上述方法的实现: # 上述方法的 Python 代码 # 单链表的定义。

17220

栈(Stack) 原

当栈中没有元素时称为空栈。 向一个栈中插入元素称为进栈或入栈或压栈(push)。插入的元素当前最新的。 从一个栈中删除元素称为出栈或退栈或弹栈(pop)。删除的元素当前最新的。...具体实现方法 利用一个数组来存储两个堆栈,每个栈各自的断点向中间延伸。 ③实现 利用数组实现一个顺序栈。...,即采用链表作为存储结构实现的栈。...它是对链表实现的简单化。 使用单向链表实现的栈只能对表头进行操作,因为不能反向查找。 3>顺序栈和链式栈对比 实现顺序栈和链式栈都需要常数时间。...            return n*recursion(n-1);         } } 4>递归的非递归实现递归程序中,主要就是一个堆栈的变化过程,程序执行过程中,堆栈由系统自动实现

70520

代码面试

何时使用快速和慢速模式的一个示例当您试图确定链接列表是否回文式时。...具有快速和慢速指针模式的问题: 链接列表周期(简单) 回文链接列表(中) 循环循环阵列(硬) 模式四:合并间隔 合并间隔模式处理重叠间隔的有效技术。...如何确定何时使用此模式: 如果要求您在不使用额外内存的情况下反向链接列表 链表模式就地反转的问题: 撤消子列表(中) 反转每个K元素子列表(中) 模式七:树的宽度优先搜索 此模式基于广度优先搜索(BFS...您可以使用递归(或使用堆栈进行迭代)在遍历时跟踪所有先前的(父)节点。...对当前节点的两个子节点进行两次递归调用以处理它们。

1.8K31

BAT面试算法进阶(7)- 反转整数

题目 给定一个 32 位有符号整数,将整数中的数字进行反转。...例如: 输入: 123 输出: 321 输入: 120 输出: 21 输入: -123 输出: -321 注意 假设我们的环境只能存储 32 位有符号整数,其数值范围 [−2^31, 2^31 − 1...解决方案 方法:弹出和推入数字 & 溢出前进行检查 思路: 我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。...算法 反转整数可以和反转字符串一起类比实现. 在没有辅助的堆栈/数组的帮助下,"弹出"和"推入"数字,可以尝试有用数学的方式....(10)- 最长的斐波那契子序列的长度(暴力法) BAT面试算法进阶(11)- 最长的斐波那契子序列的长度(动态规划法) BAT面试算法进阶(12)- 环形链表(哈希表法)

22030

忍者级别的操作JavaScript函数

普通命名函数的递归 拿普通命名函数的递归最好的举例就是用最简单的递归需求:检测回文回文的定义如下:一个短语,不管从哪一个方向读,都是一样的。...检测的工作当然方法多样,我们可以创建一个函数,用待检测的回文字符逆序生成出一个字符,然后检测二者是否相同,如果相同,则为回文字符。...但是在javascript中并非如此,在javaScript中,我们重载函数的时候只有一个实现。只不过这个实现内部通过函数实际传入的参数的特性和个数来达到相应目的的。 ?...一种通用的方法,根据传入参数的类型执行不同的操作。另一种办法,可以通过某些特定参数是否存在来进行判断。还有一种通过传入参数个数来进行判断。...重新调用该函数的时候将在此检查参数个数是否为0 这种调用方式类似于剥洋葱,每一层都检查参数个数是否匹配。这里的一个技巧关于内部匿名函数是否合访问到old和fn的。

65831

算法练习(8)-判断单链表是否回文链表

回文链表跟这个类似,比如: 0-1-2-1-0或0-1-1-0,很容易发现规律:可以找到一个对称轴,将链表分为前后二段,并且前后对折起来,完全重合。...,逐一加入堆栈,由于堆栈先进后出,这样相当于把链表翻过来了,然后跟原链表逐一对比,即:正向与反向检查所有元素是否重合。...,也能使用数组,如下图: 相对解法1,将链表转换成数组后,利用回文的特点,折半检查,循环次数能降一半,比解法1稍微快一点。...能否实现额外空间复杂度O(1),也就是常数项搞定,同时时间复杂度仍然在O(N)水平? 仔细想想,回文结构,前半段链表元素,跟后半段对称的。即:如果把后半段翻转过来,就跟前半段一样了。...所以,如果把后半段单独拿出来,反转后,再跟前半段对比,如果每个元素都一样,就是回文。不过别忘了:这样会破坏原链表,所以在检查结束后,记得将后半段,再翻转回来,跟前半段续接上,还原整个链表

42520
领券