叮叮叮,小葵花帆船启航了~🛶
前文都说了,自我感觉比较菜。所以在刚开始的题目中就先不要求自己是最优解了,先能通过再说吧~🎈
唔,先来第一道
No1
题目
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
思路
我本来想用栈,正好先进后出嘛。但是不是太会写😂。就想到了list的逆转
所以,我是这样写的:先新建一个list,然后将链表里的塞进去,然后再把list逆转。是不是很简单呀~😁
代码
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> numArr = new ArrayList<Integer>();
for(ListNode x=listNode; x!=null; x=x.next) {
numArr.add(x.val);
}
Collections.reverse(numArr);
return numArr;
}
}
或者不逆转,直接add在0:numArr.add(0,x.val)
No2
题目
给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。
数据范围: n\leq1000n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
思路
说到链表,我就想起了大学学的数据结构🙃
我们来解构一下这个链表的反转。,怎么反转呢,我们先请出我们的三个指针,小黑、小蓝、小红
所谓逆转,不就是让原本向右的指针指到左?
1 所以我们先让1的指针指到左边,也就是小黑那里
2 逆转完后,我们就要去临幸下个节点了。所以小黑、小蓝、小红均右移1
3 然后再次让2的指针指向左边
4 渣渣三人组,再次右移
虽然你看不到指针,但是3应该有个指针指向红色那边吧(我感觉啊~)
5 所以,我们让3的指针指向左边
6 然后渣渣三人组再次右移
经历了这几波后,已经没有可以逆转的指针了。怎么判断呢,可以看小黑后面已经是空的,或小蓝刚好是空。
不知道你有没有看出,这些步骤有相似之处。
对,比如1和2是1组,3和4是一组,5和6是一组。接下来,我们把他抽象为代码
代码
public ListNode ReverseList(ListNode head) {
ListNode prv = null;
ListNode cur = head;
ListNode next = null;
if(cur == null || cur.next == null) {
return cur;
}
while(cur != null) {
next = cur.next;
cur.next = prv;
prv = cur;
cur = next;
}
return prv;
}
大约就是这样子啦~🥰
😯你这么厉害,一下都可以从上图抽象过来??
不,这当然还经历过一些血与泪😢。
首先,边界值得写上吧,比如只有一个节点或者没有节点的情况
那我们如何调试,确认自己成功了呢?可以往下看
调试
首先写个listnode类
package firstDay;
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
代码的调试可以参照这个:
package firstDay;
public class No2 {
public ListNode ReverseList(ListNode head) {
ListNode prv = null;
ListNode cur = head;
ListNode next = null;
if(cur == null || cur.next == null) {
return cur;
}
while(cur != null) {
next = cur.next;
cur.next = prv;
prv = cur;
cur = next;
}
return prv;
}
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
No2 no2 = new No2();
int val = no2.ReverseList(node1).val;
System.out.println(val);
}
}
好啦,结束。这就是昨天写的了,至于今天的,我痴迷于写工具,还没开始看,接下来开始吧~