- 第一种方法:将整个链表压入栈中,再一次弹出栈中的元素和链表比对
// 判断链表是否为 回文结构
// 使用栈,把所有的节点加入栈中,然后一次出栈和链表比对
public static boolean isPalindrome(Node root){
if(root==null){
return true;
}
Node node=root;
Stack<Node> stack=new Stack<>();
while (node!=null){
stack.push(node);
node=node.next;
}
node=root;
while (!stack.isEmpty()){
if(stack.pop().value!=node.value){
return false;
}
node=node.next;
}
return true;
}
2.第二种方法 :把后一半的节点放入栈中 具体做法是, 慢指针一次走一步,快指针一次走两步,快指针走完的时候,慢指针走到中间的位置(后中间的位置)
public static boolean isPalindrome1(Node root){
if(root==null||root.next==null){
return true;
}
Stack<Node> stack=new Stack<>();
// 定义两个变量
Node quick=root;
Node slow=root.next;
while (quick.next!=null&&quick.next.next!=null){
quick=quick.next.next;
slow=slow.next;
}
// 快指针 走完快走完了, 慢指针刚还好走到,中间的位置(后中间的位置)
// 把后一半入栈
while (slow!=null){
stack.push(slow);
slow=slow.next;
}
Node node=root;
while (!stack.isEmpty()){
if(stack.pop().value!=node.value){
return false;
}
node=node.next;
}
return true;
}
3.第三种方法:只用 几个变量,判断 。 只是要改变链表的结构,注意要给别人改回去
public static boolean isPalindrome2(Node root){
if(root==null||root.next==null){
return true;
}
boolean res=true;
Node quick=root;
Node slow=root;
while (quick.next!=null&&quick.next.next!=null){
quick=quick.next.next;
slow=slow.next;
}
Node node=slow.next;
slow.next=null;
Node help=null;
// 把slow 指向的后半部分 指向 反转
while (node!=null){
help=node.next;
node.next=slow;
slow=node;
node=help;
}
// 改变链表的 指向后, slow 就指向最后一个元素
// 然后就 一次从头部和尾部比对
node=root;
// 要把 最后一个位置 记录下来
help=slow;
while (node!=null&&slow!=null){
if(node.value!=slow.value){
res=false;
break;
}
node=node.next;
slow=slow.next;
}
// 判断完之后,把链表修改回来
slow=help.next;
help.next=null;
node=null;
while (slow!=null){
node=slow.next;
slow.next=help;
help=slow;
slow=node;
}
return res;
}