-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNo707DesignLinkedList.java
More file actions
126 lines (107 loc) · 3.09 KB
/
No707DesignLinkedList.java
File metadata and controls
126 lines (107 loc) · 3.09 KB
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package com.wzx.leetcode;
/**
* @see <a href="https://leetcode.com/problems/design-linked-list/">https://leetcode.com/problems/design-linked-list/</a>
* @author wzx
*/
public class No707DesignLinkedList {
static class MyLinkedList {
private static class ListNode {
public int val;
public ListNode next;
public ListNode pre;
public ListNode(int val) {
this.val = val;
}
}
private final ListNode head;
private final ListNode tail;
private int size = 0;
/**
* Initialize your data structure here.
*/
public MyLinkedList() {
head = new ListNode(-1);
tail = new ListNode(-1);
head.next = tail;
tail.pre = head;
}
/**
* Get the value of the index-th node in the linked list. If the index is invalid, return -1.
*/
public int get(int index) {
if (index < 0 || index >= size) return -1;
return getCurNode(index).val;
}
/**
* Add a node of value val before the first element of the linked list. After the insertion, the
* new node will be the first node of the linked list.
*/
public void addAtHead(int val) {
ListNode newNode = new ListNode(val);
// head <--> newNode <--> head.next
head.next.pre = newNode;
newNode.next = head.next;
head.next = newNode;
newNode.pre = head;
size++;
}
/**
* Append a node of value val to the last element of the linked list.
*/
public void addAtTail(int val) {
ListNode newNode = new ListNode(val);
// tail.pre <--> newNode <--> tail
tail.pre.next = newNode;
newNode.pre = tail.pre;
tail.pre = newNode;
newNode.next = tail;
size++;
}
/**
* Add a node of value val before the index-th node in the linked list. If index equals to the
* length of linked list, the node will be appended to the end of linked list. If index is
* greater than the length, the node will not be inserted.
*/
public void addAtIndex(int index, int val) {
if(index > size || index < 0) return;
ListNode node = getCurNode(index);
ListNode newNode = new ListNode(val);
// node.pre <--> newNode <-> node
newNode.pre = node.pre;
node.pre.next = newNode;
newNode.next = node;
node.pre = newNode;
size++;
}
/**
* Delete the index-th node in the linked list, if the index is valid.
*/
public void deleteAtIndex(int index) {
if (index >= size || index < 0) return;
ListNode node = getCurNode(index);
// node.pre <--> node.next
node.pre.next = node.next;
node.next.pre = node.pre;
size--;
}
/**
* 根据index判断从head处遍历还是从tail处遍历
*/
private ListNode getCurNode(int index) {
ListNode node;
if (index < size - index) {
node = head;
while (index-- >= 0) {
node = node.next;
}
} else {
node = tail;
index = size - 1 - index;
while (index-- >= 0) {
node = node.pre;
}
}
return node;
}
}
}