检查LinkedList中的回文 - 比较linkedList和Reverse LinkedList.Getting错误答案?

时间:2016-06-25 05:48:40

标签: java linked-list

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

比较linkedlistlinkedlist的反向但不能比较第二个元素。它只检查原始的第一个元素并反转linkedlist并仅根据第一个元素给出答案。我是遗失了什么?

3 个答案:

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