有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有人能建议简化代码吗?

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条件会将数据推送到堆栈上


共 (5) 个答案

  1. # 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();
    }
    
  2. # 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;
    }
    

    (严格地说,这是一种重写而不是重构;然而,任何保留方法签名的重写都可以被视为重构……而且肯定更有效)

  3. # 3 楼答案

    功能的简化

    boolean isPalinDrome(String testString) {
        return new StringBuffer(testString).reverse().toString().equals(testString);
    }
    
  4. # 4 楼答案

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

    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();
    }
    
  5. # 5 楼答案

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

    abbaaa () -> push a
    bbaaa (a) -> push b
    baaa (ba) -> pop b
    aaa (a) -> pop a
    aa () -> push a
    a (a) -> pop a
    () -> palindrome