diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-01-22 11:23:20 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-01-22 11:23:20 +0100 |
commit | e33d1e9b9a531571a71fe8b16f157fc3275ee287 (patch) | |
tree | 47149b27d0d777ff32ec849f654a934b6631de3d /src/datastructures/linkedlists/template | |
parent | m (diff) | |
download | algorithms-and-data-structures-e33d1e9b9a531571a71fe8b16f157fc3275ee287.tar.gz algorithms-and-data-structures-e33d1e9b9a531571a71fe8b16f157fc3275ee287.tar.bz2 algorithms-and-data-structures-e33d1e9b9a531571a71fe8b16f157fc3275ee287.tar.xz |
reduce duplicate code
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/datastructures/linkedlists/template')
-rw-r--r-- | src/datastructures/linkedlists/template | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/datastructures/linkedlists/template b/src/datastructures/linkedlists/template new file mode 100644 index 0000000..4ea20ad --- /dev/null +++ b/src/datastructures/linkedlists/template @@ -0,0 +1,152 @@ +/* -*- java -*- */ +/** + * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +{ + /** + * Node for the list + */ + public class Node + { + /** + * Constructor + * + * @param value The value to store in the list + */ + private Node(T value) + { + this.value = value; + } + + + + /** + * The value stored in the list by this node + */ + public T value; + + /** + * The next node in the list + */ + public Node next = null; + + } + + + + /** + * The first node in the list + */ + public Node head = null; + +£>if (( with_tail )); then + /** + * The last node in the list + */ + public Node tail = null; +£>fi + + + + /** + * Insert a value in the beginning of the list + * + * @param value The value to insert + * @return The node that has be created and inserted + */ + public Node insertBeginning(T value) + { + Node node = new Node(value); + node.next = this.head; +£>if (( with_tail )); then + if (this.head == null) + this.tail = node; +£>fi + this.head = node; + return node; + } + + /** + * Remove the node at the beginning of the list + * + * @return The node that has been removed + */ + public Node removeBeginning() + { + Node node = head; + if (node != null) + head = head.next; +£>if (( with_tail )); then + if (this.tail == node) + this.tail = null; +£>fi + return node; + } + + /** + * Insert a value after a specified, reference, node + * + * @param value The value to insert + * @param predecessor The reference node + * @return The node that has be created and inserted + */ + public Node insertAfter(T value, Node predecessor) + { + Node node = new Node(value); + node.next = predecessor.next; + predecessor.next = node; +£>if (( with_tail )); then + if (this.tail == predecessor) + this.tail = node; +£>fi + return node; + } + + /** + * Remove the node after a specified, reference, node + * + * @param predecessor The reference node + * @return The node that has been removed + */ + public Node removeAfter(Node predecessor) + { + Node node = predecessor.next; + if (node == null) + predecessor.next = node.next; +£>if (( with_tail )); then + if (this.tail == node) + this.tail = predecessor; +£>fi + return node; + } + +£>if (( with_tail )); then + /** + * Insert a value in the end of the list + * + * @param value The value to insert + * @return The node that has be created and inserted + */ + public Node insertEnd(T value) + { + if (this.tail == null) + return insertBeginning(value); + return insertAfter(value, this.tail); + } +£>fi + +} + |