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;
}
}


浙公网安备 33010602011771号