回文就是从左往右和从又往左都是一样的数。
方法1:
将每一个节点都入栈,然后再从链表的头部开始和栈中的元素进行比对,弹出一个比对一次,如果每次比对都相等,就说明是回文的。
public static Boolean isReverse(SingleLinkList list) {
Node temp = list.head.next;
Stack<Node> stack = new Stack();
while(temp!=null) {
stack.add(temp);
temp = temp.next;
}
temp = list.head.next;
while(temp!=null) {
if(temp.no!=stack.pop().no) {
return false;
}
temp = temp.next;
}
return true;
}
方法2:将后半段的链表放入到栈中,然后得到链表的中间节点,将中间节点之后的节点放到栈中,然后将链表前半部分和栈中元素进行比对,如果都相同的话就是回文的。
那么首先得找到中间节点。使用快慢指针,快指针一次走两步,慢指针一次走一步,当快指针到达链表尾部的时候,慢指针就到达了中间,但是这个中间得看情况,链表节点是奇数和偶数这个中点是不一样的。
如果是奇数个节点,那么就刚刚好走到中间,
如果是偶数个节点,走到中间的左边位置。
public static int findMid(SingleLinkList list) {
Node f = list.head.next;
Node s = list.head.next;
int mid = 1;
while(true) {
if(f.next==null||f.next.next==null) {
break;
}
f = f.next.next;
s = s.next;
mid ++;
}
return mid;
}
然后将中点之后的所有节点存到栈中。再一个一个拿出来比对,如果全部相同那么就是回文。
public static boolean isReverse(SingleLinkList list) {
int mid = findMid(list);
Node temp = list.head.next;
Stack<Node> s = new Stack<Node>();
for(int i=1;i<mid;i++) {
temp = temp.next;
}
while(temp!=null) {
s.add(temp);
temp = temp.next;
}
temp = list.head.next;
while(!s.isEmpty()) {
if(temp.no != s.pop().no) {
return false;
}
temp = temp.next;
}
return true;
}