如何在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,对吧? 我是对的还是你可以告诉我,如果我误解了任何概念? 谢谢

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

 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语言中传递指针一样。 如果你改变了那个对象的内容(最终你做了,因为reverse你把它放在next ),那么它就会保持变化。

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