判断链表是否是回文

  1. 第一种方法:将整个链表压入栈中,再一次弹出栈中的元素和链表比对

    // 判断链表是否为 回文结构
    // 使用栈,把所有的节点加入栈中,然后一次出栈和链表比对
    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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值