Skip to content

Instantly share code, notes, and snippets.

@MeilCli
Created May 11, 2015 06:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MeilCli/e37962abd2eb66443f3b to your computer and use it in GitHub Desktop.
Save MeilCli/e37962abd2eb66443f3b to your computer and use it in GitHub Desktop.
LinkedList test
package linkedlist;
public class Item<T> {//ジェネリクス使用
public final T element;//final fieldにするのでgetter,setter使わない
private Item<T> nextItem;
private Item<T> previousItem;
protected Item(T element){//protected修飾子でインスタンス生成を制限
this.element=element;
}
public Item<T> getNextItem() {
return nextItem;
}
public void setNextItem(Item<T> nextItem) {
this.nextItem = nextItem;
}
public Item<T> getPreviousItem() {
return previousItem;
}
public void setPreviousItem(Item<T> previousItem) {
this.previousItem = previousItem;
}
}
package linkedlist;
public class LinkedList<T> {
private int count;
private Item<T> firstItem;
private Item<T> lastItem;
public LinkedList() {
this.count = 0;
}
public int size(){
return count;
}
private Item<T> findItem(int index) {
if (this.count > index && index >= 0) {
// めんどくさいので前方からのみ探索する
Item<T> result = this.firstItem;
for (int i = 0; i < index; i++) {
result = result.getNextItem();
}
return result;
}
return null;
}
public void insert(T element, int index) {
if (index < 0) {
return;
}
if (this.count < index) {// 要素数が足りない
while (this.count < index) {
addLast(null);
}
}
if (this.count == index) {
addLast(element);
} else if (index == 0) {
addFirst(element);
} else {
Item<T> item = new Item<T>(element);
Item<T> replaseItem = findItem(index);// 探索は必ず成功するはず
if (replaseItem.getPreviousItem() != null) {
item.setPreviousItem(replaseItem.getPreviousItem());
replaseItem.getPreviousItem().setNextItem(item);
}
item.setNextItem(replaseItem);
replaseItem.setPreviousItem(item);
this.count++;
}
}
public void addLast(T element) {
Item<T> item = new Item<T>(element);
Item<T> replaceItem = this.lastItem;
this.lastItem = item;
if (replaceItem != null) {
replaceItem.setNextItem(item);
item.setPreviousItem(replaceItem);
} else {// 最後の要素がない→最初の要素もない
this.firstItem = item;
}
this.count++;
}
public void addFirst(T element) {
Item<T> item = new Item<T>(element);
Item<T> replaceItem = this.firstItem;
this.firstItem = item;
if (replaceItem != null) {
replaceItem.setPreviousItem(item);
item.setNextItem(replaceItem);
} else {// 最初の要素がない→最後の要素もない
this.lastItem = item;
}
this.count++;
}
public void delete(int index) {
this.remove(index);
}
public void remove(int index) {
Item<T> item = findItem(index);
if (item == null) {
return;
}
Item<T> previousItem = item.getPreviousItem();
Item<T> nextItem = item.getNextItem();
if (previousItem == null && nextItem == null) {
this.firstItem = null;
this.lastItem = null;
} else if (previousItem == null) {
this.firstItem = nextItem;
nextItem.setPreviousItem(null);
} else if (nextItem == null) {
this.lastItem = previousItem;
previousItem.setNextItem(null);
} else {
previousItem.setNextItem(nextItem);
nextItem.setPreviousItem(previousItem);
}
this.count--;
}
public int locate(T element) {
return indexOf(element);
}
public int indexOf(T element) {
Item<T> item = this.firstItem;
for (int i = 0; i < this.count; i++) {
if (item.element!=null&&item.element.equals(element)) {
return i;
}
item = item.getNextItem();
}
return -1;
}
public T Retrieve(int index) {
return get(index);
}
public T get(int index) {
Item<T> result = findItem(index);
return result == null ? null : result.element;
}
public T top() {
Item<T> item = this.firstItem;
return item == null ? null : item.element;
}
public T last() {
Item<T> item = this.lastItem;
return item == null ? null : item.element;
}
}
package linkedlisttest;
import linkedlist.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
System.out.println("count:"+list.size());
list.insert(1, 1);
list.insert(2, 4);
list.insert(1, 0);
list.insert(1, 1);
list.addLast(3);
list.addFirst(-1);
list.remove(list.indexOf(2));
for(int i=0;i<list.size();i++){
System.out.print(list.get(i));
System.out.print(' ');
}
System.out.print('\n');
System.out.println("count:"+list.size());
list.addLast(4);
list.addLast(5);
list.remove(list.size() - 1);
System.out.println(list.last() == 4 ? "true" : "false");
list.addFirst(-2);
list.addFirst(-3);
list.remove(0);
System.out.println(list.top() == -2 ? "true" : "false");
while(list.size() > 1) {
list.remove(0);
}
System.out.println(list.top() == list.last() ? "true" : "false");
list.remove(0);
System.out.println(list.top() == null && list.last() == null ? "true" : "false");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment