0
public boolean isPalindrome()
{

    Stack myStack = new Stack();
    for(Node current = head; current!=null; current = current.next)
    {
        if(!myStack.isEmpty())
        {
            if(myStack.peek()==current.data)
            {
                myStack.pop();
            }else if(current.next!=null&&myStack.peek()==current.next.data)
            {
                continue;
            }
            else
            {
                myStack.push(current.data);
            }
        }else
        {

            myStack.push(current.data);
        }   

    }

    return myStack.isEmpty();
}

我在这里做的是使用堆栈来检查链表是否是回文。它按预期工作,唯一的事情是我想摆脱代码重复,其中 else 条件将数据推送到堆栈上。

4

5 回答 5

7

不幸的是,该算法不正确。对于“abbaaa”,它会报告这是一个回文,尽管它不是。在不使用长度的情况下检查回文是很困难的。

abbaaa () -> push a
bbaaa (a) -> push b
baaa (ba) -> pop b
aaa (a) -> pop a
aa () -> push a
a (a) -> pop a
() -> palindrome
于 2012-08-01T22:31:25.933 回答
2

这是一个有点经典的问题。在java中有很多方法可以解决它。最简单的一个是这个:

boolean isPalindrome(String s) {
   for (int i=0, len=s.length(); i<len/2; i++) {
      if (s.charAt(i) != s.charAt(len-i-1)) return false;
   }
   return true;
}

(严格来说,这是重写而不是重构;但是,任何保留方法签名的重写都可以被视为重构......而且它肯定更有效)

于 2012-08-01T22:29:08.117 回答
1

如果您只想删除两个 else 条件之间的代码重复,则将它们完全删除。

public boolean isPalindrome()
{

    Stack myStack = new Stack();
    for(Node current = head; current!=null; current = current.next)
    {
        if(!myStack.isEmpty())
        {
            if(myStack.peek()==current.data)
            {
                myStack.pop();
                continue;
            }else if(current.next!=null&&myStack.peek()==current.next.data)
            {
                continue;
            }
        }                   
        myStack.push(current.data);             
    }

    return myStack.isEmpty();
}
于 2012-08-01T22:26:13.333 回答
0

功能的简化;

boolean isPalinDrome(String testString) {
    return new StringBuffer(testString).reverse().toString().equals(testString);
}
于 2012-08-01T22:37:27.543 回答
0

这应该提供相同的功能而无需重复。但是有人指出,您的算法似乎不正确。

public boolean isPalindrome()
{

    Stack myStack = new Stack();
    boolean doPush;
    for(Node current = head; current!=null; current = current.next)
    {
        doPush = true;
        if(!myStack.isEmpty())
        {
            if(myStack.peek()==current.data)
            {
                doPush = false;
                myStack.pop();
            }else if(current.next!=null&&myStack.peek()==current.next.data)
            {
                doPush = false;
                continue;
            }
        }   
        if(doPush){                
            myStack.push(current.data);  
        }           
    }

    return myStack.isEmpty();
}
于 2012-08-01T22:38:13.500 回答