题目要求:
给定一个单链表,请判断该链表是否是一个回文链表。所谓回文链表,就是链表从前往后和从后往前是一样的。
例如:
1、2、2、1 就是一个回文链表
1、2、1、1 就不是一个回文链表
常规思路:
这题的常规思路比较容易,因为所谓回文就是倒序仍然一样,那么,就想办法倒叙就可以了。想到倒叙,什么数据结构会导致倒叙?没错,就是栈,先进后出。因此,用一个辅助栈,把链表元素依次入栈,然后,再依次出栈,一个个比较出栈元素和链表从头遍历的元素是否相同,就可以判断是否是回文链表。
注意: 常规思路是需要一个辅助栈的,因此空间复杂度为O(n),一般笔试中推荐使用常规思路。
代码:
public static boolean isPallindrome(singleLink node){
Stack stack=new Stack();
singleLink index=node;
while (index!=null){
stack.push(index.value);
index=index.next;
}
while (node!=null){
if(node.value!=stack.pop()){
return false;
}
node=node.next;
}
return true;
}
特殊思路:
在面试中,一般会问特殊思路,比如在空间复杂度O(1)的前提下,判断回文链表。
特殊思路,使用快慢指针,快指针一次跑两步,慢指针每次跑一步,当快指针到达终点时,慢指针到达中间。然后,翻转后半部分的链表,然后依次从头指针向后遍历,同时,慢指针指向的中间也往后遍历,依次对比,如果全部相同,就是回文链表。最后要记得,把后半部分翻转后的链表在翻转回原状。