-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDoubleLinkedList.java
More file actions
111 lines (99 loc) · 2.7 KB
/
DoubleLinkedList.java
File metadata and controls
111 lines (99 loc) · 2.7 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
/**
* A double linked list class
* @author Jake Model
*/
public class DoubleLinkedList<T> {
private DLNode<T> head;
private DLNode<T> tail;
// Constructor for class
public DoubleLinkedList(){
head = tail = null;
}
/**
* return head of DLL
* @return head
*/
public DLNode<T> getHead() {
return this.head;
}
/**
* Set head of DLL
* @param head
*/
public void setHead(DLNode<T> head) {
this.head = head;
}
/**
* Get tail of DLL
* @return tail
*/
public DLNode<T> getTail() {
return this.tail;
}
/**
* Set tail of DLL
* @param tail
*/
public void setTail(DLNode<T> tail) {
this.tail = tail;
}
/**
* Add a node to DLL
* @param node
*/
public void add(DLNode<T> node) {
if (head == null) {
head = tail = node;
}
else {
tail.setNext(node);
node.setPrev(tail);
setTail(node);
}
}
/**
* Swap a node with its successor
* @param node
*/
public void swap(DLNode<T> node) {
DLNode<T> index = head;
// Find the node
while (index != node || index.getNext() != null) {
index = index.getNext();
}
// Case 1, node is not near an edge
if ((index.getNext() != null) && (index != head) && (index != tail)) {
index.getNext().getNext().setPrev(index);
index.getPrev().setNext(index.getNext());
index.getNext().setPrev(index.getPrev());
index.setPrev(index.getNext());
index.setNext(index.getNext().getNext());
}
// Case 2, node is head
else if ((index.getNext() != null) && (index == head)) {
index.getNext().getNext().setPrev(index);
setHead(index.getNext());
head.setNext(index);
head.setPrev(null);
index.setPrev(index.getNext());
index.setNext(index.getNext().getNext());
}
// Case 3, node is tail
else if ((index.getNext() != null) && (index.getNext() == tail)) {
setTail(node);
node.getNext().setNext(node);
node.getNext().setPrev(node.getPrev());
node.setPrev(node.getNext());
node.setNext(null);
}
// Case 4, node is head, successor is tail
else if ((index == head) && (index.getNext() == tail)) {
setHead(node.getNext());
setTail(node);
node.setPrev(node.getNext());
node.setNext(null);
node.getPrev().setPrev(null);
node.getPrev().setNext(node);
}
}
}