启航~算法刷题第一天

叮叮叮,小葵花帆船启航了~🛶

前文都说了,自我感觉比较菜。所以在刚开始的题目中就先不要求自己是最优解了,先能通过再说吧~🎈

启航~算法刷题第一天


唔,先来第一道

No1

题目

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。

如输入{1,2,3}的链表如下图:

img

思路

我本来想用栈,正好先进后出嘛。但是不是太会写😂。就想到了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}。

以上转换过程如下图所示:

img
思路

说到链表,我就想起了大学学的数据结构🙃

我们来解构一下这个链表的反转。,怎么反转呢,我们先请出我们的三个指针,小黑、小蓝、小红

所谓逆转,不就是让原本向右的指针指到左?

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

好啦,结束。这就是昨天写的了,至于今天的,我痴迷于写工具,还没开始看,接下来开始吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨_浅-

你的一毛/分钱是我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值