数据结构与算法 学习笔记(上)

油管上的CS61B的视频
学习代码

随看随记

  • Java 值传递 赋值
  • 对于递归来讲,最重要的就是 base case(基础)和 neighbor(邻居)
  • 对于List的递归 尽量去判断其列表本身 list 多去迭代几次而不是 其list.rest
  • 对于List的迭代 尽量用迭代器 并不适用this 关键字
  • 静态方法只能改变静态变量,因为要遵守黄金法则。
  • java.util.Arrays.equals 可以比较两个数组内所有的项的内容是否相等。
  • 对于一个SLList来讲,SLList的地址是sentinel的地址,通过sentinel来对整个包装列表进行操作。

Hello World

  • Java中所有的代码都必须写在Class中
  • 在这里插入图片描述
  • .java -> 编译(javac)->.class->解释器 -> 运行代码

Defining and Using Classes

  • 当人为编译 DogLauncher时 java会自动编译Dog 因为DogLauncher需要有Dog依赖才能继续运行
  • 在这里插入图片描述
  • 1
  • 仅仅声明 并未实例化
  • 仅仅实例化 但是没有对象赋值 无法使用 会直接被java当作垃圾回收
  • 将一个已经实例化以后的狗分配给已经声明的变量

References, Recursion, and Lists

  • 在这里插入图片描述

  • 205.75 被储存到32位中 前16位是小数点前 后16位是小数点后

  • 在这里插入图片描述
    在这里插入图片描述

  • 声明 和 new 的创建对象

Java List 链表表示

原始List创建

带有构造函数的List创建

在这里插入图片描述

获取List的长度l.size()(递归方法)

-在这里插入图片描述

获取List的长度l.size()(迭代方法)

  • 在这里插入图片描述

  • size方法迭代可视化

  • 在 iterativeSize中 p 可以直接通过l的指针this来得到 我好久没遇见这种写法了

总结练习

  • 在效率等方面 迭代更好 但是递归的代码更简洁
  • 在这里插入图片描述

-get的递归写法内存图解

  • 注意学习一下递归的写法,要注意base case(基本盘)和neighbor(邻居 ),将beighbor想 base case上靠即可。

习题

  • 两个函数的可视化
  • 主要是迭代在List中的利用
  • 迭代要针对当前list 而不是而不是list.rest
  • List的迭代不要使用this 关键字

SLList 列表的包装类

  • 设计LIst包装类的目的就是 隐藏掉对象 只通过索引就可以找到相应的存储内容。

addFirst() 和 getFirst()

安全与密封

  • 通过将IntNode 嵌入到SLList中来进行包装 并将其设置成私有和静态 来拒绝外部的直接访问,提高了SLList的安全性
public class MySLList {
   

    // 在外界不需要关注并且需要保护的情况下 需要将其设置成私有
    // 在外界不需要操作 嵌套类的时候 可以将其设置成 静态 static
    // 将static 看成 never looks outwards 
    private static class MyIntNode {
   

        public int item;
        public MyIntNode next;

        public MyIntNode(int i, MyIntNode n) {
   
            item = i;
            next = n;
        }
    }

    private MyIntNode first;

    public MySLList(int x) {
   
        first = new MyIntNode(x, null);
    }

    /**
     * 返回列表中的第一项
     */
    public int getFirst(){
   

        return first.item;
    }

    /**
     * 添加一个int 到list的最前面
     */
    public void addFirst(int x){
   
        first = new MyIntNode(x, first);
    }


    public static void main(String[] args) {
   
        MySLList L = new MySLList(10);
        L.addFirst(15);

    }
}

addLast() 和 size()

  • 两个方法的可视化 size的迭代的方法也在里面
  • 在包装后类如果想实现递归 就需要 建立一个私有的对外非公开的方法来代替原有的方法进行递归操作 用其输入参数的来进行递归操作
  • 个人感觉在包装以后 迭代操作会更加容易一点 但是递归需要建立私有静态类的思想要了解。

Cache

  • 使用递归来获得size的方法复杂度过高 因此引入size成员变量 来进行缓存 每次进行 add操作的时候仅仅需要操作size get的时候仅仅需要 return this.size 就可以了 大大减小了时间的消耗

Empty List

  • 主要解决的问题 在存在空构造之后 会有可能存在第一个节点的对象为null,需要额外用if语句进行条件判断。如下所示,因此引入哨兵节点。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值