检查链表是否是回文

问题描述 投票:0回答:2
public boolean palindromLinkedList() {
    //find size
    Node temp = head;
    int size=0;
    while(temp != null){
        size++;
        temp=temp.next;
    }
    //find while loop iteration
    int c;
    if(size%2 ==0){
        c = size/2;
    }else{
        c = (size+1)/2;
    }
    //intialise start and end pointer
    Node start = head;
    Node end = tail;
    //index pointer
    int k =size-1;
    //loop for the palindrome condition
    while(c > 0)`
        if(start.data != end.data){
            return false;
        }
        start = start.next;
        Node find = head;
        k--;
        for(int i=0;i<=k;i++){
            find = find.next;
        }
        end = find;
        c--;
    }
    return true;
}

我尝试使用类似于两个指针的方法来检查链表是否是回文。
我初始化了两个变量:

start = head
end = tail

start从start开始检查节点,end从tail开始检查,检查start和end的数据是否相等后,我将更改后的start指向下一个节点,并使用for循环找到end的前一个节点,这个过程继续,直到指针到达中间节点。

如果链表是回文,则返回 true,否则返回 false。我认为我的方法是正确的,但我似乎错过了一些东西。

java linked-list palindrome
2个回答
0
投票

看来你实现了自己的链表,使得这个问题很难回答。

但是,假设您的代码类似于 java.util.LinkedList:

java中的

==
检查引用,而不是给定的对象。您应该使用
.equals
来比较节点数据。 更好的是
Objects.equals(start.data, end.data)
,因为它还可以处理
null

这种行为的一个很好的例子是字符串。 Java 收集您在程序中硬编码的字符串,因此它有时可以工作,但大多数时候却不能。

"abc" == "abc" // true
"abc".equals("abc") // true
"abc" == new String("abc") // false
"abc".equals(new String("abc")) // true
"abc" == getUserPassword() // false
"abc".equals(getUserPassword()) // true if user enters abc

我建议您实现双链表,因为它将提高性能,并在这种情况下使您的生活变得更加轻松。 它基本上也添加了对前一个节点的引用。 因此,您不需要循环遍历所有元素,但可以使用

end.previous
获取前一个节点。


0
投票

问题出在这行代码:

        for (int i = 0; i <= k; i++) {

此循环进行一次迭代到多次迭代。更改为:

        for (int i = 0; i < k; i++) {

这将解决即使是最简单的测试用例也会得到的错误输出。

但是现在你会遇到另一个问题:这段代码太慢了。您必须重复循环才能确定

end
之前的节点成本太高,并且使您的实现具有 O(𝑛²) 时间复杂度。您需要想出更好的主意。

这个问题之前已经被解决过多次,并且在这个网站上您还可以找到更有效的方法来完成它的解释。

© www.soinside.com 2019 - 2024. All rights reserved.