StringBuilder 在 Java 中如何反向工作?

How does StringBuilder reverse work in Java?

我正在尝试解决这个 leetcode 问题 https://leetcode.com/problems/palindrome-linked-list/ ,但 运行 遇到字符串和字符串生成器的问题。出于某种原因,"12".equals"21" -> returns 为真。

我尝试从字符串构建器转换为字符串,并且只使用字符串构建器。

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”测试用例失败,returns 正确。

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);

这是一个仅使用 2 个 StringBuilder 而不是 3 个并且不使用 built-in 反向方法的方法。相反,while 循环遍历链表,将当前节点附加到 originalStringBuilder,并将当前节点插入到 reversedStringBuilder 的前面。所以 built-in 插入方法有助于反转节点值的顺序:

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;
}