如何在Java中检查链表是否是回文?

时间:2015-05-08 17:06:32

标签: java reference linked-list parameter-passing

我写了一个代码来检查单链表是否是回文。我做了两个步骤:

第一。反转原始链表。

第二。检查原始链表和反向链表是否具有相同的元素。

    public static Boolean isPalindrome(Node input){
        Node reversed= reverse(input);
        while (input!=null){
            if(input.item!=reversed.item)
                return false;
            input=input.next;
            reversed=reversed.next;
            }
            return true;
    }
    static Node head;
    public static Node reverse(Node input){
        if(input==null || input.next==null){
            head=input;
            return input;
        }
        else{
            reverse(input.next);
            input.next.next=input;
            input.next=null;
            return head;
        }
    }

这个程序有效。但是我想,当执行reverse方法时,由于原始链表的头被传入,所以原来的链表也可能会改变,所以isPalindrome也应该返回true,对吧?我是对的还是你可以告诉我,我是否误解了任何概念?感谢

这是主要功能以及我如何使用该代码:

public static void main(String [] args){
    Node a=new Node(9);
    Node b=new Node(8);
    Node c=new Node(7);
    Node d=new Node(6);
    a.next=b;
    b.next=c;
    c.next=d;
    //d.next=c;
    Boolean tf=isPalindrome(a);
    if (tf)
        System.out.println("Is Palindrome!");
    else
        System.out.println("Not Palindrome");
}

1 个答案:

答案 0 :(得分:3)

实际上,您的方法正在运作。尝试使用包含3,4,5,3的列表。它将返回true

此外,它会更改传递给它的列表,这不是一个好主意。如果您在运行方法后执行System.out.println(a)(假设您编写了正确的toString()方法),您会惊讶地发现它只有一个项目...

这确实是因为传递对象引用就像在C之类的语言中传递指针一样。如果你改变了那个对象的内容(最终你做了,因为在reverse中你将null放在next中),那么它就会改变。

那么为什么你的程序会返回true?因为正如我所说,input成为一个单项目列表。 reversed包含完整的反转列表,input仅指向其最后一项。由于你循环input,然后,如果第一项和最后一项是相同的,你将获得true - 无论该列表是否为回文。那是因为你只迭代input指向的一个项目。