Я пытаюсь решить этот вопрос leetcode https://leetcode.com/problems/palindrome-linked-list/ , но возникли проблемы со строками и построителями строк. По какой-то причине "12".equals"21" -> возвращает true.
Я попытался преобразовать из построителя строк в строку и просто использовать построитель строк.
class Solution {
public boolean isPalindrome(ListNode head) {
StringBuilder s = new StringBuilder();
while (head != null) {
s.append(head.val);
head = head.next;
}
String a = s.reverse().toString();
String b = s.toString();
return a.equals(b);
}
}
Он терпит неудачу в тестовом примере «12» и возвращает true.




StringBuilder reverse не создает новый экземпляр StringBuilder. Это приводит к тому, что базовые символы текущего StringBuilder меняются местами. Так,
String a = s.reverse().toString();
String b = s.toString();
Второй s.toString() работает на обратную StringBuilder.
ты должен сделать
String original = s.toString();
String reversed = s.reverse().toString();
return original.equals(reversed);
@Carcigenicate Да, если связанный список невелик.
Вот один, использующий только 2 StringBuilder вместо 3 и не использующий встроенный реверсивный метод. Вместо этого цикл while проходит через связанный список, добавляет текущий узел в original StringBuilder и вставляет текущий узел перед reversed StringBuilder. Таким образом, встроенный метод вставки помогает изменить порядок значений узлов:
public boolean isPalindrome(ListNode head) {
StringBuilder original = new StringBuilder(), reversed = new StringBuilder();
ListNode curr = head;
while (curr != null) {
original.append(curr.val);
reversed.insert(0, curr.val);
curr = curr.next;
}
return original.toString().equals(reversed.toString()) ? true : false;
}
Или просто не используйте здесь StringBuilder и придерживайтесь старых добрых неизменяемых строк. Разница в производительности, скорее всего, не будет иметь значения, если она есть здесь.