707. Design Linked List

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
class MyLinkedList {

private static class Node {
private final int val;
private Node prev;
private Node next;

public Node(int val) {
this.val = val;
}
}

private final Node dummyHead;
private final Node dummyTail;

public MyLinkedList() {
this.dummyHead = new Node(-1);
this.dummyTail = new Node(-1);
this.dummyHead.next = this.dummyTail;
this.dummyTail.prev = this.dummyHead;
}

public int get(int index) {
Node node = getNode(index);
return node == null ? -1 : node.val;
}

private Node getNode(int index) {
Node curr = dummyHead;
for (int i = 0; i <= index && curr != null; i++) {
curr = curr.next;
}

if (curr == null || curr == dummyTail) {
return null;
}
return curr;
}

public void addAtHead(int val) {
Node node = new Node(val);
node.next = dummyHead.next;
node.prev = dummyHead;
dummyHead.next.prev = node;
dummyHead.next = node;
}

public void addAtTail(int val) {
Node node = new Node(val);
node.prev = dummyTail.prev;
node.next = dummyTail;
dummyTail.prev.next = node;
dummyTail.prev = node;
}

public void addAtIndex(int index, int val) {
Node curr = dummyHead;
for (int i = 0; i < index && curr != null; i++) {
curr = curr.next;
}
if (curr == null || curr.next == null) {
return;
}

Node node = new Node(val);
node.prev = curr;
node.next = curr.next;
if (curr.next != null) {
curr.next.prev = node;
}
curr.next = node;
}

public void deleteAtIndex(int index) {
// 因为是双向链表,直接定位至需要删除的链表节点
Node node = getNode(index);
if (node != null) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
}

}

References

707. Design Linked List