Day02_剑指Offer

Day02_剑指Offer

加油啊啊啊啊啊!!!坚持
坚持30天,看看成效。小目标

一天两道剑指Offer题,大家都有美好的未来。加油!!!

package com.sorrymaker.day2602;

import org.junit.Test;

import java.util.LinkedList;

/**
 *
 * 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
 * @Author nextGame
 * @Date 2021/8/13 23:00
 * @Version 1.0
 */
public class ReversePrint {

    public class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

    public int[] reversePrint(ListNode head) {
        //定义一个栈
        LinkedList<Integer> stack = new LinkedList<>();
        while (head!=null){
            //遍历链表,然后把每个元素入栈。
            //addLast(E e):在链表尾部添加一个元素;

            //这里有点不理解,addLast方法,是把元素放到栈的最后面 和下面取栈的最后面的一个元素。不理解,但是知道啥意思。
            stack.addLast(head.val);
            //每次添加完成后,把下一个元素赋值给head。
            head=head.next;
        }
        //获取stack的长度 ==> res数组的长度。
        int[] res = new int[stack.size()];
        for(int i = 0; i <res.length;i++){
            //removeLast(E e):删除尾部元素;  特有方法
            res[i] = stack.removeLast();
        }
        return res;
    }
}

package com.sorrymaker.day2602;

import java.util.LinkedList;

/**
 * 反转链表
 * 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
 *
 * @Author nextGame
 * @Date 2021/8/13 23:45
 * @Version 1.0
 */
public class ReverseList {
    public class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

    public ListNode reverseList(ListNode head) {
        //定义两个指针: prepre 和 curcur ;prepre 在前 curcur 在后。
        //每次让 prepre 的 nextnext 指向 curcur ,实现一次局部反转
        //局部反转完成之后, prepre 和 curcur 同时往前移动一个位置
        //循环上述过程,直至 prepre 到达链表尾部

        //1.定义cur为null,pre为链表的head。
        ListNode cur = null, pre = head;

        //当pre = null 值,说明cur 已经遍历完链表了。
        while(pre != null) {
            //tmp存储pre.next,即是head.next。
            ListNode tmp = pre.next;
            //把pre.next = null ,这一步是重置pre.next的意思
            pre.next = cur;
            //把pre现在的位置赋值给cur。
            cur = pre;
            //再把刚刚的tmp = pre.next 即pre的下一个元素赋值给pre。
            pre = tmp;
        }
        //经历了上面的循环后,pre为null,而cur已经遍历完原来的链表,形成一个新的链表。
        return cur;
    }
}

posted @ 2021-08-14 00:22  独眼龙  阅读(33)  评论(0)    收藏  举报