Java 通过将回文链表转换为字符串来检测回文链表

Java 通过将回文链表转换为字符串来检测回文链表,java,linked-list,Java,Linked List,我应该检查链表是否是回文,所以我遍历了LL并将所有元素转换为字符串,然后将字符串传递给一个函数,该函数确定它是否是回文 这种方法正确吗?在面试和测试中是否适合使用这种方法 我在网上找到的方法颠倒了LL,然后一个接一个地比较所有的值,但老实说,我的方法似乎更简单。以下是我的代码片段: public static boolean isPalindromeString(String s) { int n = s.length(); for (int i = 0; i < (n/

我应该检查链表是否是回文,所以我遍历了LL并将所有元素转换为字符串,然后将字符串传递给一个函数,该函数确定它是否是回文

这种方法正确吗?在面试和测试中是否适合使用这种方法

我在网上找到的方法颠倒了LL,然后一个接一个地比较所有的值,但老实说,我的方法似乎更简单。以下是我的代码片段:

public static boolean isPalindromeString(String s) {
    int n = s.length();

    for (int i = 0; i < (n/2); i++) {
        if (s.charAt(i) != s.charAt(n - i - 1))
            return false;
    }

    return true;
}

public static boolean isPalindrome(LinkedListNode<Integer> head) {    
    if(head == null)
        return true; //when list is empty, it is a palindrome
    
    StringBuilder s = new StringBuilder();
    
    while(head != null){
        s.append(head.data);
        head = head.next;
    }

    // System.out.println("LL as string: " + s.toString());

    return isPalindromeString(s.toString());
}
public静态布尔值isAlindRomestring(字符串s){
int n=s.长度();
对于(int i=0;i<(n/2);i++){
如果(s.charAt(i)!=s.charAt(n-i-1))
返回false;
}
返回true;
}
公共静态布尔值isAlindrome(LinkedListNode头){
if(head==null)
return true;//列表为空时为回文
StringBuilder s=新的StringBuilder();
while(head!=null){
s、 附加(标题数据);
head=head.next;
}
//System.out.println(“LL作为字符串:+s.toString());
返回isAlindromestring(s.toString());
}

尝试添加几行代码,例如 在第三行添加以下内容:

int itr = n-1;
现在替换这个:

if (s.charAt(i) != s.charAt(n - i - 1))
与:

在结尾处,在if语句结尾处添加以下行,并在for循环中添加:

itr--;

这取决于你如何定义回文

  • 这个列表是回文吗<代码>[1,2,3,321]
  • 怎么样
    [10,20,10]
  • 或者
    [-5,-5]
如果答案分别为“是”、“否”和“否”,那么代码可以完成任务,否则不会


此外,如果您得到的linkedlistnode(它不是标准java,必须是您家庭作业练习的一部分)是所谓的双链接列表(这意味着:您可以向前和向后遍历它,并且有一种方法可以快速轻松地获取最后一个元素),那么有一种更有效的方法可以做到这一点。如果没有,这种方法很好。

您的方法很简单,但占用更多内存和处理器

链表的优点在于它在处理大量元素时的内存效率。链表的每个节点对象分别存储在堆内存中。这样就不需要为大型列表分配巨大的连续空间。这会提高内存效率,但会增加时间复杂性。反转链表也容易得多。只需将
下一个
节点替换为合适的节点即可。java链表通常有一个
last
参数,使其更容易反转。(最坏情况下,单链表可能需要O(n**2)和双链表需要O(n)时间)

将每个元素添加到StringBuilder对象并将其转换为单个字符串时,最终的字符串将占用一个连续的内存块。如果生成的字符串非常大,内存消耗也会更高。另外,String对象还有一些链表所没有的其他开销。(有关详细信息,请检查此项:)


因此,尽管您的算法有效,但在处理大型列表时可能效率低下。

您的方法有效,但效率低下。这是使用单链表还是双链表?不,它实际上不起作用。想象一下下面的列表:[ AB ]、“CD”、“D”、“CBA”。此方法将在返回false时返回true。
itr--;