编程语言
首页 > 编程语言> > 如何在Java中检查链表是否为回文?

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

作者:互联网

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

1.反转原始链表.

第2位.检查原始链表和反向链表是否具有相同的元素.

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

该程序有效.但是我认为,当执行反向方法时,由于原始链表的头部已传入,因此原始链表也可能会发生变化,因此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");
}

解决方法:

实际上,您的方法无效.尝试使用包含3、4、5、3的列表.它将返回true.

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

这确实是因为传递对象引用就像传递诸如C之类的语言的指针一样.如果更改了该对象的内容(最终您做了,因为相反,您在下一个对象中放置了null),则它保持不变.

那么为什么您的程序返回true?正如我所说,因为输入变成了一个单项列表.反向包含完整的反向列表,输入仅指向其最后一项.由于您循环输入,因此如果第一项和最后一项相同,则将为真-列表是否为回文.这是因为您仅迭代输入所指向的一项.

标签:java,reference,parameter-passing,linked-list
来源: https://codeday.me/bug/20191011/1891447.html