# 第六十三周ARTS总结

# Algorithm

0ms | 100.00% Run time
39.4MB | 43.64% Memory

public ListNode deleteDuplicates(ListNode head) {
    // 作一个非空判断
    if (head == null) {
        return null;
    }

    // 新链表的头的前一个节点
    ListNode newHead = new ListNode();

    // 新链表的当前节点
    ListNode currNew = newHead;

    // 旧链表的当前节点
    ListNode curr = head;

    // 上一个节点的值
    int lastVal = curr.val;

    while (curr.next != null) {
        // 如果当前节点的值和下一个节点的值不相同,并且和上一个节点的值也不相同(第一个节点除外),则加入新链表
        if (curr.val != curr.next.val && (curr == head || curr.val != lastVal)) {
            currNew.next = curr;
            currNew = currNew.next;
        }

        lastVal = curr.val;
        curr = curr.next;
    }

    // 判断最后一个节点的情况
    if (curr == head || curr.val != lastVal) {
        currNew.next = curr;
        currNew = currNew.next;
    }

    // 去掉多余的节点(很重要)
    currNew.next = null;

    return newHead.next;
}
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

0ms | 100.00% Run time
39.3MB | 50.77% Memory

public ListNode deleteDuplicates(ListNode head) {
    if (head == null) {
        return null;
    }

    // 新链表当前节点
    ListNode currNew = head;

    // 当前节点
    ListNode curr = head;

    while (curr.next != null) {
        if (curr.val != curr.next.val) {
            currNew.next = curr.next;
            currNew = currNew.next;
        }

        curr = curr.next;
    }

    // 清空多余节点
    currNew.next = null;

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

# Review

# Tip

  • 进程的不同状态:
    • 创建状态
    • 就绪状态
    • 运行状态
    • 阻塞状态
    • 结束状态
    • 挂起状态
  • 方法栈主要用来存放参数、返回地址、局部变量等
  • 多态和动态绑定的的意义:创建对象的代码和操作对象的代码往往不在同一个地方,操作对象的代码往往只知道对象的某种父类,也往往只需要知道他是某种类型的父类就可以了
  • 所有的子类都必须在构造方法中通过某种方式调用父类的构造方法,否则会编译错误
  • Thread通过UncaughtExceptionHandler对象来处理未捕获异常的情况:finally {Process.killProcess(Process.myPid());System.exit(10);}

# Share

暂无内容

更新时间: 10/20/2022, 7:04:01 AM