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();
}
我在这里做的是使用堆栈来检查链表是否是回文。它按预期工作只是我想摆脱代码重复,其他条件将数据推送到堆栈。
答案 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();
}