/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
if(head === null){
return true;
}
var current, runner;
current = head;
runner = head;
runner = reverseList(runner);
while(current !== null && runner !== null){
if(current.val != runner.val){
return false;
}
else{
current = current.next;
runner = runner.next;
}
}
return true;
};
这是我的反向功能。这是我认为我遇到的问题最多的地方。我遇到与this post类似的问题,但我并不完全确定如何修复对象引用问题。
var reverseList = function(head){
var previous, current, next;
current = head;
previous = null;
next = null;
while(current !== null){
next = current.next;
current.next = previous;
previous = current;
current = next;
}
head = previous;
return previous;
}
给[1,3,4,5,1]的输入返回true,所以我认为运行reverse函数只返回链表中的单个节点。
感谢任何帮助。
答案 0 :(得分:1)
你的设置中有两个错误我会指向你...如果你想要解决它们如何修复它们,我可以给你那些,但因为这看起来像一个学习问题我'我只是指出你正确的方向。
第一个错误确实在你的reverseList函数中,但不是因为它只返回一个节点。问题是您通过引用传递原始列表,然后对其进行操作,因此在reverseList /
结尾处包含[1,5,4,3,1]时,{{1} }不再包含[1,3,4,5,1]。您需要查看如何在不破坏初始列表的情况下生成反向列表...
其次,runner
中的反转后的逻辑假定两个列表的长度相同,但如果一个列表只是另一个列表的前缀,则返回true(例如,如果head
恰好在您的操作之后[1]并且isPalindrome
包含[1,5,4,3,1])