Implement a function to check a linked list is a palindrome
检查一个链表是否为回文
思路:
1 Iterative,利用栈,把链表前半段存入栈,再逐个弹栈和链表后半段比较。注意链表长度为奇数的情况!要跳过中间节点!
2 递归!
定义递归函数为Result rec(LinkedListNode head, int length) 意义为传入链表头结点和链表长度,返回该链表的尾节点的下一个节点
Result是一个Wrapper 类,包含了node和当前是否match的判断
递归的关键是要清楚递归函数的每一个参数的意义是什么,还有返回值的意义是什么!!!
如下图:假设在递归的某一个阶段,要比较前半段的那个1和后半段的那个1是否相等:
根据递归可以得到蓝色部分的返回值Result,包含了一个res.node和match值。res.node的意义就是该子链表的尾节点的下一个节点,即后半段的1!
然后我们可以把head指向的1和res.node指向的1比较。如果相同则设置match为true,并且更新本层递归(红色区域)的返回值为本层子链表的尾节点(1)的下一个节点(0),作为res.node返回。
package LinkLists;
import java.util.Stack;
import CtCILibrary.LinkedListNode;
public class S2_7 {
// 利用栈,把链表前半段存入栈,再逐个弹栈和链表后半段比较
public static boolean isPalindrome(LinkedListNode head) {
LinkedListNode fast = head;
LinkedListNode slow = head;
Stack<Integer> stack = new Stack<Integer>();
while (fast != null && fast.next != null) {
stack.push(slow.data);
slow = slow.next;
fast = fast.next.next;
}
if (fast != null) { // 只有当链表长度为奇数时,fast才不会为null
slow = slow.next; // 这时要跳过中间节点
}
while (slow != null) { // 边弹栈边比较
int top = stack.pop().intValue();
if (top != slow.data) {
return false;
}
slow = slow.next;
}
return true;
}
// 递归
public static boolean isPalindrome2(LinkedListNode head) {
int size = 0;
LinkedListNode n = head;
while (n != null) {
size++;
n = n.next;
}
Result p = rec(head, size);
return p.match;
}
// 传入链表头结点和链表长度,返回该链表的尾节点的下一个节点
public static Result rec(LinkedListNode head, int length) {
if (head == null || length == 0) { // 空链表,肯定是回文
return new Result(null, true);
} else if (length == 1) { // 只有1个节点,肯定是回文
return new Result(head.next, true);
} else if (length == 2) { // 有两个节点,如果相同则是回文
return new Result(head.next.next, head.data == head.next.data);
}
Result res = rec(head.next, length-2); // 长度缩小2的子链表问题,res存放子问题的结果和子链表尾节点的下一个节点
if(!res.match || res.node==null) { // 不match
return res;
} else{
res.match = head.data == res.node.data; // 比较当前节点和尾节点是否相等
res.node = res.node.next; // 更新返回值,即该链表的尾节点的下一个节点
return res;
}
}
static class Result {
public LinkedListNode node;
public boolean match;
public Result(LinkedListNode n, boolean res) {
node = n;
match = res;
}
}
public static void main(String[] args) {
int length = 10;
LinkedListNode[] nodes = new LinkedListNode[length];
for (int i = 0; i < length; i++) {
nodes[i] = new LinkedListNode(i >= length / 2 ? length - i - 1 : i, null, null);
}
for (int i = 0; i < length; i++) {
if (i < length - 1) {
nodes[i].setNext(nodes[i + 1]);
}
if (i > 0) {
nodes[i].setPrevious(nodes[i - 1]);
}
}
// nodes[length - 2].data = 9; // Uncomment to ruin palindrome
LinkedListNode head = nodes[0];
System.out.println(head.printForward());
System.out.println(isPalindrome2(head));
}
}
分享到:
相关推荐
本文实例讲述了C++判断一个链表是否为回文结构的方法。分享给大家供大家参考,具体如下: 题目: 给定一个链表头节点head,请判断是否为回文结构 例如: 1->2->1 true 1->2->2->1 true 1->2->3->4->2->1 false 解题...
判断链表是否为回文链表 leetcode 力码算法 算法问题问题 1. 给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。 问题2.判断一个整数是否是回文。 当一个整数向后读与向前读相同时,它就是回文。 有效...
判断链表是否为回文链表 leetcode LeetCode 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 给定一个 32 位有符号整数,将整数中的数字进行反转 判断一个整数是否是回文数。回文数是指正序(从左向右...
判断链表是否为回文链表 leetcode LeetCode 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 给定一个 32 位有符号整数,将整数中的数字进行反转 判断一个整数是否是回文数。回文数是指正序(从左向右...
元素录入,以“&”为中间符号,以“@“为结束判断, 例如:123&321@ 是回文,abc&bca 不是;
判断链表是否为回文链表 leetcode 解决方案 来自 LeetCode 和 HackerRank 的在线算法问题的C++解决方案。 力码 问题在 LeetCode 中列出,并附有相应的标题和问题编号 1. [2] 给定两个表示两个非负整数的非空链表。 ...
判断链表是否为回文链表 leetcode 力码 leetcode 的解决方案。 二和。 给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。 您可以假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素。 例子...
判断链表是否为回文链表 leetcode CTCI #Leetcode 自交 移动零将数组中的零移向末尾而不改变元素的原始位置 反转树 旋转树中的所有节点,使左节点变为右节点,右节点变为左节点。 从 LL 中删除节点 从 LL 中删除一个...
判断链表是否为回文链表 leetcode 使用 JavaScript 刷 LeetCode 同类题 求和 0002-链表求和(高位在右) 0445-链表求和 II(高位在左) 0067-二进制数字符串求和 0415-十进制数字符串求和 0989-数字数组加上一个数 ...
判断链表是否为回文链表 leetcode JSLeetCode 指示 运行测试:** tbd LeetCode - JavaScript 版 我的 JavaScript 方法的存储库,用于解决 Leetcode 和其他问题。 此处列出了每个问题,并附有指向原始问题详细信息...
判断链表是否为回文链表 leetcode 我的问题的soutions。 简单的问题 问题一 问题描述 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume...
判断链表是否为回文链表 leetcode Algorithms Coding_Interviews and Leetcode 回文字符串判断 求和为给定值的两个数 在有序数组中求和为给定值的两个数 判断二叉树是否对称 回文数字判断 判断二叉树是否相等 反转...
判断链表是否为回文链表 leetcode 最近,我发现自己很笨拙(╯`□′)╯(┻━┻。 所以我决定做一些练习来唤起我的智慧。 好的,开始吧~ ps:请原谅我可怜的英语 :) #目录: ##day1 这个算法是要计算一个等差数列的...
判断链表是否为回文链表 leetcode leetcode-javascript LeetCode 算法练习题解 数据结构与算法 旋转矩阵 零矩阵(编写一种算法,若 M × N 矩阵中某个元素为 0,则将其所在的行与列清零。) 队列-实现 栈-实现 最...
判断链表是否为回文链表 leetcode /** Leetcode 样题练习 */ 无重复字符的最长子串 反转单链表。 你正在爬楼梯。 需要n步才能到达顶部。 每次您可以爬 1 步或 2 步。 你可以通过多少种不同的方式登上顶峰? (注意:...
判断链表是否为回文链表 leetcode 力码 我的 leetcode 问题解决方案。 二和 给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。 您可以假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素。...
判断链表是否为回文链表 leetcode LeetCode leetcode dayly fun koltin解leetcode 可能时间空间复杂度不是最优的,但是能AC android开发刷题练练手 先easy后medium 最后才考虑hard 主要是锻炼开拓思维和灵活运用各种...
c语言 c语言编程题之链表操作回文链表
判断链表是否为回文链表 leetcode TS代码挑战 在 Typescript 中实现的代码挑战/解决方案。 建造 在编写新解决方案时,在监视模式下构建以捕获任何构建错误是有帮助的: yarn build:watch 要动态生成解决方案表并将其...