2 回答
TA贡献1815条经验 获得超10个赞
似乎您想检查回文就位,但您没有说明这样的要求,所以我提出了一种更直接的算法:
初始化堆栈
遍历列表并将每个元素压入栈顶
直到栈不为空:
弹出栈顶
将弹出的元素与列表的头部进行比较
如果不相等,返回
false弹出另一个元素,在列表中向前移动一个元素
返回
true
这是一个带有泛型的 Java 实现:
public <T> boolean isPalindrome(ListNode<T> head) {
Stack<ListNode<T>> stack = new Stack<>();
ListNode<T> x = head;
while(x != null) {
stack.push(x);
x = x.next;
}
while(!stack.isEmpty()) {
ListNode<T> el = stack.pop();
if(el.t != head.t) return false;
head = head.next;
}
return true;
}
该算法在时间上为 O(n),在空间上为 O(n)。
TA贡献1818条经验 获得超7个赞
在第一个 while 循环中找到链表的中间时,为什么不维护一个指向 tort 之前节点的指针:
ListNode prev_tort = head;
while(hare!=null && hare.next!=null) {
//System.out.print("Hare "+ hare.val +"tort "+tort.val);
hare = hare.next.next;
prev_tort = tort;
tort = tort.next;
}
现在,当元素数为偶数时,hare 将为 NULL。因此,对于奇数情况,跳过中间节点:
if(hare != NULL){
tort = tort.next;
prev_tort = prev_tort.next;
}
tort = reverseLL(tort);
prev_tort.next = tort; // only to ensure list is connected
然后是您的比较代码。
此外,在 reverseLL() 函数中:
ListNode rev = reverseLL(nextElem);
head.next.next = head;
head.next = NULL;
return rev;
如果我理解正确,您正在尝试通过反转后半部分来检查列表是否为回文。在那种情况下,对于输入 1->2->3->4,在反转下半场后不应该 tort 指向 4 吗?这就是上面的代码所做的(列表将是:1->2->4->3)。
添加回答
举报
