2 回答

TA貢獻(xiàn)1815條經(jīng)驗 獲得超10個贊
似乎您想檢查回文就位,但您沒有說明這樣的要求,所以我提出了一種更直接的算法:
初始化堆棧
遍歷列表并將每個元素壓入棧頂
直到棧不為空:
彈出棧頂
將彈出的元素與列表的頭部進(jìn)行比較
如果不相等,返回
false
彈出另一個元素,在列表中向前移動一個元素
返回
true
這是一個帶有泛型的 Java 實現(xiàn):
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貢獻(xiàn)1818條經(jīng)驗 獲得超7個贊
在第一個 while 循環(huán)中找到鏈表的中間時,為什么不維護(hù)一個指向 tort 之前節(jié)點的指針:
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;
}
現(xiàn)在,當(dāng)元素數(shù)為偶數(shù)時,hare 將為 NULL。因此,對于奇數(shù)情況,跳過中間節(jié)點:
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() 函數(shù)中:
ListNode rev = reverseLL(nextElem);
head.next.next = head;
head.next = NULL;
return rev;
如果我理解正確,您正在嘗試通過反轉(zhuǎn)后半部分來檢查列表是否為回文。在那種情況下,對于輸入 1->2->3->4,在反轉(zhuǎn)下半場后不應(yīng)該 tort 指向 4 嗎?這就是上面的代碼所做的(列表將是:1->2->4->3)。
添加回答
舉報