Created
May 11, 2015 06:14
-
-
Save MeilCli/e37962abd2eb66443f3b to your computer and use it in GitHub Desktop.
LinkedList test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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