Link単端リンク表

1810 ワード

Linkは以下のAPIを提供します
addFirst,removeFirst
get Length
has Next
next
リセット
insertAfter
removeAfter
indexOf
 
Nodeは補助構造であり、簡便のために標準set、get方法は使用されず、記憶されている内容は非負の整数であると仮定する.
この構造は一方向単一端チェーンテーブルの構造を最も簡略化し、このデータ構造に対してのみ実現できる非常に便利な方法を提供する.insertAfterのみ提供されていますが、insertBeforeは提供されていません. 
 
class Node {
	private int value;
	private Node next;

	Node(int value) {
		this.value = value;
	}

	int value() {
		return value;
	}

	void next(Node next) {
		this.next = next;
	}

	Node next() {
		return next;
	}
}
 
class Link {
	private Node first;
	private int length;
	private Node current;

	void addFirst(int value) {
		Node node = new Node(value);
		node.next(first);
		first = node;
		length++;
	}

	int removeFirst() {
		if(first == null) return -1;
		int result = first.value();
		first = first.next();
		length--;
		return result;
	}

	int getLength() {
		return length;
	}

	boolean hasNext() {
		return current == null? first != null : current.next() != null;
	}

	int next() {
		current = (current == null? first : current.next());
		return current.value();
	}

	void reset() {
		current = null;
	}

	void insertAfter(int value) {
		if(current == null) addFirst(value);
		else {
			Node node = new Node(value);
			node.next(current.next());
			current.next(node);
			length++;
		}
	}

	int removeAfter() {
		if(current == null) return removeFirst();
		if(current.next() == null) return -1;
		int result = current.next().value();
		current.next(current.next().next());
		return result;
	}

	int indexOf(int value) {
		int i = 0;
		Node temp = first;
		while(temp != null) {
			if(temp.value() == value) return i;
			temp = temp.next();
			i++;
		}
		return -1;
	}
}