반응형
List.java
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 | //List 인터페이스,<T>는 타입 public interface List<T> { //임의의 위치에 데이터 삽입 public boolean add(T data, int index); //맨 첫번째에 데이터 삽입 public boolean addFirst(T data); //맨 마지막에 데이터 삽입 public boolean addLast(T data); //맨 끝에 데이터 삽입 public boolean add(T data); //인덱스 값을 통해 임의 위치 값 줄력 public T get(int index); //리스트의 크기 값 public int size(); //마지막 리스트 의 값 출력 public T getLast(); //맨 첫번째 리스트의 값 출력 public T getFirst(); //임의 위치에 삭제 public T remove(int index); //첫번째 위치 삭제 public T removeFirst(); //마지막 위치 삭제 public T removeLast(); //마지막 위치 삭제 public T remove(); } | cs |
LinkedList.java
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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | package min.java.begin; //연결리스트 public class LinkedLists<T> implements Lists<T> { //클래스 노드 private static class Node<T> { private T data; private Node<T> next; //생성자 Node() { data = null; next = null; } //생성자 Node(final T data) { this.data = data; this.next = null; } } //리스트 노드의 header private Node<T> header = null; //리스트의 사이즈 값 private int size; //생성자 LinkedLists() { //객체 생성 header = new Node<T>(); size = 0; } //첫번째 위치 데이터 추가 @Override public boolean addFirst(T data) { Node<T> newNode = new Node<T>(data); //리스트에 데이터가 존재하지 않는다면 맨첫번째 위치에 데이터를 추가하는 것. if (header == null) { header.next = newNode; size++; return true; } else { //리스트가 존재하면 기존의 맨앞에 있는 데이터를 뒤로 넘기고 새로운 노드를 앞에 생성 newNode.next = header.next; header.next = newNode; size++; return true; } } //마지막 위치 데이터 주가 @Override public boolean addLast(T data) { if (size == 0) { addFirst(data); return true; } else { add(data, size); return true; } } //마지막 위치 데이터 주가 @Override public boolean add(T data) { add(data, size); return true; } //임의의 위치 데이터 추가 @Override public boolean add(T data, int index) { if (index == 0) { addFirst(data); return true; } //새로운 노드 생성 Node<T> newNode = new Node<T>(data); //임의의 위치 이전노드 Node<T> prev = getNode(index - 1); //임의의 위치 다음노드 Node<T> next = prev.next; // 리스트 중간에 데이터를 삽입하는 과정 prev.next = newNode; newNode.next = next; size++; return true; } //임의 위치 리스트 값 출력 @Override public T get(int index) { return getNode(index).data; } //첫번째 리스트 값 출력 @Override public T getFirst() { return getNode(0).data; } //마지막 리스트의 값 출력 @Override public T getLast() { return getNode(size - 1).data; } //모든 리스트의 값 출력 @Override public String toString() { Node<T> temp = header.next; if (temp == null) { return "[ ]"; } else { //StringBuilder 클래스를 이용하여 데이터를 출력 StringBuilder sb = new StringBuilder("["); sb.append(temp.data); temp = temp.next; while (temp != null) { sb.append(", "); sb.append(temp.data); temp = temp.next; } sb.append("]"); return sb.toString(); } } //리스트의 개수 출력 @Override public int size() { return size; } //임의의 위치 삭제 @Override public T remove(int index) { if (index > size) { throw new IndexOutOfBoundsException("Index overflow is " + index + ", size is " + size); } if (size <= 0 || index < 0) { throw new IndexOutOfBoundsException("Not data error, size is " + size); } else if (index == 0) { return removeFirst(); } else { Node<T> prev = getNode(index - 1); Node<T> remove = prev.next; prev.next = remove.next; size--; return remove.data; } } //첫번째 위치 삭제 @Override public T removeFirst() { if (size <= 0) { throw new IndexOutOfBoundsException("Not data error, size is " + size); } else { Node<T> temp = getNode(0); header.next = temp.next; size--; return temp.data; } } //마지막 위치 삭제 @Override public T removeLast() { if (size <= 0) { throw new IndexOutOfBoundsException("Not data error, size is " + size); } else { return remove(size - 1); } } //마지막 위치 삭제 @Override public T remove() { return removeLast(); } public Node<T> getNode(int index) { //인덱스값이 -1이거나 인덱스가 사이즈보다 크다면 Exception 에러 출력 if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("index is : " + index + "size : " + size); } Node<T> move = header.next; int i = 0; //index 위치까지 노드 이동 while (i < index) { move = move.next; i++; } return move; } } | cs |
반응형
'Language > Java' 카테고리의 다른 글
[NIO] 파일 채널(FileChannel) (0) | 2016.04.06 |
---|---|
달력만들기 (0) | 2016.03.25 |
Java 줄바꿈 처리 (0) | 2016.03.07 |
SocketAddress 클래스와 NetworkInterface 클래스 (0) | 2015.12.17 |
InetAddress 클래스 (0) | 2015.12.16 |