有人可以建议简化代码吗?

时间:2012-08-01 22:19:44

标签: java refactoring

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

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
}

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

答案 2 :(得分:1)

如果你想要做的就是删除其他两个条件之间的代码重复,那么完全删除它们。

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

答案 3 :(得分:0)

简化功能;

boolean isPalinDrome(String testString) {
    return new StringBuffer(testString).reverse().toString().equals(testString);
}

答案 4 :(得分: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();
}