红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec5-DLList

DLList

DLList

为了让remove等操作更加高效,我们在SLList的基础上进行改进,变为双向链表,这样有利于提升操作效率

同时,对于头节点的操作,我们可以用两个头节点,但更好的方法是使用循环链表

具体实现详见Project1

Generic Lists

我们设计的SLList目前只接受int类型,通过修改可以实现接受各种类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package lec5;

// 数字列表
public class GenericList<T> {
    private class TNode {
        public T item;
        public TNode next;

        public TNode(T i, TNode n){
            item = i;
            next = n;

        }
    }

    //列表的第一项
    private TNode sentinel;
    private int size;

    public GenericList(){
        sentinel = new TNode(null, null);
        size = 0;
    }
    public void addFirst(T x){
        size++;
        sentinel.next = new TNode(x, sentinel.next);
    }

    public T getFirst(){
        return sentinel.next.item;
    }

    public void addLast(T x){
        size++;
        TNode p = sentinel;
        while(p.next!=null){
            p = p.next;
        }
        p.next = new TNode(x, null);
    }

    public int size(){
        return size;
    }

    public static void main(String[] args){
        GenericList<Integer> L = new GenericList<>();
        L.addFirst(10);
        L.addFirst(5);
        L.addLast(20);
        System.out.println(L.getFirst());
        System.out.println(L.size());
    }

}

泛型的规则如下:

  • .java文件中实现数据结构时,需要在文件开头设定泛型且只能设定一次

  • .java文件中使用数据结构时,设定需要的数据类型

    类名<引用类型> 实例名 = new 类名<>();

  • 声明和实例化时,需要使用引用类型

    • int:Integer

    • double:Double

    • char:Character

    • boolean:Boolean

    • long:Long

Arrays

数组是一种拥有指定长度内存的对象,组成如下:

  • 固定整型长度

  • N=length个内存空间

    • 所有内存空间有着相同数据类型
    • 索引从0到length-1

初始化方法

1
2
3
4
x = new int[3];
y = new int[]{1,2,3,4,5};

int[] z = {9, 10, 12, 13};

数组复制

  • 使用循环逐个复制
  • 使用System.arraycopy(),包括五个参数
    • 源数组
    • 源数组起始位置
    • 目标数组
    • 目标数组起始位置
    • 复制元素个数

二维数组

二维数组