检查链表是否是Java中的回文库?

时间:2019-05-24 03:35:50

标签: java string palindrome

我正在尝试解决这个leetcode问题 https://leetcode.com/problems/palindrome-linked-list/,但是遇到字符串和字符串生成器的麻烦。由于某些原因,“ 12” .equals“ 21”->返回true。

我尝试仅使用stringbuilder从字符串生成器转换为字符串。

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。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这里仅使用2个StringBuilders而不是3个,并且不使用内置的反向方法。相反,while循环遍历链接列表,将当前节点附加到original StringBuilder,然后将当前节点插入reversed StringBuilder的前面。因此,内置的insert方法有助于反转节点值的顺序:

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