public class CheckPalindromeLL {
public static void main(String args[])
{
Link head=null;
Link l1=createLinkList1(head);
Link l2=l1;
System.out.println("first linklist");
display(l1);
System.out.println("reveresed linklist");
Link rev=reverse(l1);
Link rev2=rev;
display(rev2);
System.out.println("IS PALINDROME");
compare(l1,rev);
}
private static Link reverse(Link l11) {
Link l12=l11;
// TODO Auto-generated method stub
Link nextp;
Link curr=l12;
Link prevp=null;
while(curr!=null)
{
nextp=curr.next;
curr.next=prevp;
prevp=curr;
curr=nextp;
}
return prevp;
}
private static boolean compare(Link d1, Link d2) {
boolean flag=true;
while((d1!=null) && (d2!=null)&& flag)
{
if(d1.num!=d2.num)
{ System.out.println("not same ");
flag=false;
break;
}
else
{
System.out.println("list:"+d1.num);
System.out.println("rev:"+d2.num);
System.out.println(" same");
d1=d1.next;
d2=d2.next;
}
}
System.out.println("printing flag"+flag);
return flag;
}
private static Link createLinkList1(Link head) {
// TODO Auto-generated method stub
Link firstlink=head;
Link newLink = null;
Scanner reader = new Scanner(System.in);
System.out.println("Enter a number: ");
int x[]={1,2,3,1};
for(int i=0;i<x.length;i++)
{
newLink=new Link(x[i]);
newLink.next=firstlink;
firstlink=newLink;
}
head= firstlink;
return newLink;
}
public static void display(Link start)
{
Link s1=start;
while(s1!=null)
{
System.out.println(s1.num);
s1=s1.next;
}
}
}
比较linkedlist
和linkedlist
的反向但不能比较第二个元素。它只检查原始的第一个元素并反转linkedlist
并仅根据第一个元素给出答案。我是遗失了什么?
答案 0 :(得分:2)
这是一个ASCII艺术描述你的列表(单数)在每一步看起来像什么。我省略了多余的陈述和印刷陈述:
Link l1=createLinkList1(head);
l1-+
|
V
1 -> 2 -> 3 -> 1 -> null
Link rev=reverse(l1);
rev------------------+
|
l1-+ |
| |
V V
null <- 1 <- 2 <- 3 <- 1
compare(l1,rev);
您只创建一个列表和一组节点而不是两个。当你reverse()
时,你会重新排列指针,但是l1
指向曾经是第一个元素但现在是最后一个元素。
答案 1 :(得分:0)
您需要以相反的顺序创建原始列表的完整副本。这应该做的伎俩:
private static Link reverse(Link l)
{
Link result = null;
while(l != null)
{
Link ll = new Link(l.value);
ll.next = result;
result = ll;
l = l.next;
}
return result;
}
同样补充:如果您有一个双重链接列表(对于您愿意调整实施的情况......),您可以轻松检查回文并不创建反向副本:
private static boolean isPalindrome(Link head, Link tail)
{
if(head == null)
{
return true; // arguable, if empty list is palindrome or not...
}
while(head != tail)
{
if(head.value != tail.value)
{
return false;
}
head = head.next;
if(head == tail) // need this for even number of list elements
{
break;
}
tail = tail.previous;
}
return true;
}
修改强> 只是一个噱头:检查回文而不重复列表(递归):
private static boolean isPalindrome(Link head)
{
return head == null ? true : isPalindrome(new Link[] { head }, head);
}
private static boolean isPalindrome(Link[] head, Link tail)
{
if(tail.next != null)
{
if(!isPalindrome(head, tail.next))
{
return false;
}
head[0] = head[0].next;
}
return head[0].value == tail.value;
}
答案 2 :(得分:0)
为了检查LinkedList是否是回文,您可以使用以下代码:
请注意,java.util.LinkedList是双重链接列表。
public class Palindrome<T extends Comparable>{
public boolean isPalindrome(LinkedList<T> list){
Iterator<T> iterator = list.iterator();
Iterator<T> reverseIterator = list.descendingIterator();
while(iterator.hasNext()&&reverseIterator.hasNext()){
if(!iterator.next().equals(reverseIterator.next())){
return false;
}
}
return true;
}
}