• leetcode234 回文链表 两种做法(stack(空间非O(1)),空间O(1))


    link: leetcode234 回文链表

    方法1, 快慢指针,把前半部分存入栈中和后半部分比较

    public boolean isPalindrome(ListNode head) {
            if(head == null || head.next == null) return true;
            Stack<Integer> stack = new Stack<>();
            ListNode slow = head;
            ListNode fast = head;
            while(true){
                stack.push(slow.val);
                slow = slow.next;
                if(fast.next == null){//odd
                    stack.pop();
                    break;
                }
                if(fast.next.next == null){ //even
                    break;
                }
                fast = fast.next.next;
            }
            boolean flag = true;
            while (!stack.empty() && slow != null){
                int temp = stack.pop();
                if(slow.val == temp){
                    slow = slow.next;
                }else {
                    flag = false;
                    break;
                }
            }
            if(!stack.empty() || slow != null)
                flag = false;
                
                
            return flag;
        }
    

    方法2, 快慢指针,把前半部分反转与后半部分比较

    public boolean isPalindrome2(ListNode head) { // O(1)
            if(head == null || head.next == null) return true;
            if(head.next.next == null){
                if(head.next.val == head.val){
                    return true;
                }else{
                    return false;
                }
            }
            ListNode slow = head;
            ListNode fast = head;
            int cnt= 0;
            while(true){
                slow = slow.next;
                cnt ++;
                if(fast.next == null){//odd
                    cnt --;
                    break;
                }
                if(fast.next.next == null){ //even
                    break;
                }
                fast = fast.next.next;
            }
            // System.out.println("after while, slow.val =" +slow.val);
            ListNode fan = head;
            ListNode temp = head;
            ListNode newHead = head;
            int n = 0;
            // System.out.println("cnt= " + cnt);
            while (n < cnt - 1){
                temp = fan.next;
                fan.next = fan.next.next;
                temp.next = newHead;
                newHead = temp;
                // System.out.println("temp =" +temp.val);
                n++;
    
            }
            fan.next = null;
    
            boolean f = true;
            while(true){
                // System.out.println(slow.val + " | " + newHead.val);
                if(slow.val == newHead.val){
                    slow = slow.next;
                    newHead = newHead.next;
                }else {
                    f = false;
                    break;
                }
                if(slow == null && newHead != null){
                    f = false;
                    break;
                }else if(slow != null && newHead == null){
                    f = false;
                    break;
                }else if(slow == null && newHead == null){
                    break;
                }
            }
            return f;
        }
    
  • 相关阅读:
    hdu 2680:Choose the best route(Dijkstra , SPFA)
    Gym
    Gym
    Gym
    常用的相似度计算
    kafka 配置
    Kafka-broker配置说明
    kafka 安装以及测试
    adaboost算法
    solr scheme配置简介
  • 原文地址:https://www.cnblogs.com/wmxl/p/11296361.html
Copyright © 2020-2023  润新知