leetcode-回文链表

题目:

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false
leetcode-回文链表_第1张图片

解法一(利用栈):

    /**
     *思路:先遍历链表数出链表长度(len)并把链表转化为List,
     *      要是偶数就把前len/2个节点的val值push到栈中,
     *      然后开始遍历比较栈顶元素与index与len/2是否相同,全部相同则返回true,否则false
     *      要是奇数就把前(len-1)/2个节点的val值push到栈中
     *      然后开始遍历比较栈顶元素与index与(len+1)/2是否相同,全部相同则返回true,否则false
     */
    public boolean isPalindrome(ListNode head) {
        if (head.next == null){
            return true;
        }
        //使用栈来处理
        Stack<Integer> stack = new Stack<>();

        List<Integer> list = new ArrayList<>();

        ListNode cur = head;//辅助节点,用来遍历链表

        while (cur != null){
            list.add(cur.val);
            cur = cur.next;
        }

        //偶数情况
        if (list.size()%2 == 0){
            for (int i = 0 ; i < list.size()/2 ; i++){
                stack.push(list.get(i));
            }
            for (int i = list.size()/2; i < list.size() ; i++){
                if (list.get(i) != stack.peek()){
                    return false;
                }else stack.pop();
            }
        }
        //奇数情况
        if (list.size()%2 == 1){
            for (int i = 0 ; i < (list.size()-1)/2 ; i++){
                stack.push(list.get(i));
            }
            for (int i = (list.size()+1)/2; i < list.size() ; i++){
                if (list.get(i) != stack.peek()){
                    return false;
                }else stack.pop();
            }
        }
        return stack.empty();
    }

解法二(双指针):

  /**
     *思路:双指针
     * ①先把链表转化为ArrayList
     * ②用两个指针一个指向数组头,一个指向数组尾
     * ③比较两个指针位置的数字是否相同,不同返回false,全部相同返回true
     */
    public boolean isPalindrome(ListNode head) {

        List<Integer> list = new ArrayList<>();

        ListNode cur = head;

        while (cur != null){
            list.add(cur.val);
            cur = cur.next;
        }

        int front = 0;//前指针
        int rear = list.size()-1;//后指针

        while (front < rear){
            if (list.get(front) != list.get(rear)){
                return false;
            }
            front++;
            rear--;
        }
        return true;
    }

你可能感兴趣的:(链表,leetcode,数据结构)