package collection.link;
public class MyLinkedListV2 {
private Node first;
private int size = 0;
public void add(Object e) {
Node newNode = new Node(e);
if (first == null) {
first = newNode;
} else {
Node lastNode = getLastNode(first);
lastNode.next = newNode;
}
size++;
}
private Node getLastNode(Node first) {
Node x = first;
while (x.next != null) {
x = x.next;
}
return x;
}
// 추가 코드
public void add(int index, Object e) {
Node newNode = new Node(e);
if (index == 0) {
newNode.next = first;
first = newNode;
} else {
Node prev = getNode(index - 1);
newNode.next = prev.next;
prev.next = newNode;
}
size++;
}
public Object set(int index, Object element) {
Node x = getNode(index);
Object oldValue = x.item;
x.item = element;
return oldValue;
}
// 추가 코드
public Object remove(int index) {
Node removeNode = getNode(index);
Object removeItem = removeNode.item;
if (index == 0) {
first = removeNode.next;
} else {
Node prev = getNode(index - 1);
prev.next = removeNode.next;
}
removeNode.item = null;
removeNode.next = null;
size--;
return removeItem;
}
public Object get(int index) {
Node node = getNode(index);
return node.item;
}
private Node getNode(int index) {
Node x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
}
public int indexOf(Object o) {
int index = 0;
for (Node x = first; x != null; x = x.next) {
if (o.equals(x.item)) {
return index;
}
index++;
}
return -1;
}
public int size() {
return size;
}
@Override
public String toString() {
return "MyLinkedListV1{" +
"first=" + first +
", size=" + size +
'}';
}
}
package collection.link;
public class MyLinkedListMainV2 {
public static void main(String[] args) {
MyLinkedListV2 list = new MyLinkedListV2();
System.out.println("==데이터 추가==");
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
// 첫 번째 항목에 추가 삭제
System.out.println("첫 번째 항목에 추가 삭제");
list.add(0, "d");
System.out.println(list);
list.remove(0);
System.out.println(list);
// 중간 항목에 추가, 삭제
list.add(1, "e");
System.out.println(list);
list.remove(1);
System.out.println(list);
}
}
package collection.link;
public class MyLinkedListV3<E> {
private Node<E> first;
private int size = 0;
public void add(E e) {
Node<E> newNode = new Node<>(e);
if (first == null) {
first = newNode;
} else {
Node<E> lastNode = getLastNode(first);
lastNode.next = newNode;
}
size++;
}
private Node<E> getLastNode(Node<E> first) {
Node<E> x = first;
while (x.next != null) {
x = x.next;
}
return x;
}
// 추가 코드
public void add(int index, E e) {
Node<E> newNode = new Node<>(e);
if (index == 0) {
newNode.next = first;
first = newNode;
} else {
Node<E> prev = getNode(index - 1);
newNode.next = prev.next;
prev.next = newNode;
}
size++;
}
public E set(int index, E element) {
Node<E> x = getNode(index);
E oldValue = x.item;
x.item = element;
return oldValue;
}
// 추가 코드
public E remove(int index) {
Node<E> removeNode = getNode(index);
E removeItem = removeNode.item;
if (index == 0) {
first = removeNode.next;
} else {
Node<E> prev = getNode(index - 1);
prev.next = removeNode.next;
}
removeNode.item = null;
removeNode.next = null;
size--;
return removeItem;
}
public Object get(int index) {
Node<E> node = getNode(index);
return node.item;
}
private Node<E> getNode(int index) {
Node<E> x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
}
public int indexOf(Object o) {
int index = 0;
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item)) {
return index;
}
index++;
}
return -1;
}
public int size() {
return size;
}
@Override
public String toString() {
return "MyLinkedListV1{" +
"first=" + first +
", size=" + size +
'}';
}
// 제네릭 노드 관련 내부 정적 클래스 생성
private static class Node<E> {
E item;
Node<E> next;
public Node(E item) {
this.item = item;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Node<E> x = this;
sb.append("[");
while (x != null) {
sb.append(x.item);
if (x.next != null) {
sb.append("->");
}
x = x.next;
}
sb.append("]");
return sb.toString();
}
}
}
package collection.link;
public class MyLinkedListMainV3 {
public static void main(String[] args) {
MyLinkedListV3<String> list = new MyLinkedListV3<>();
System.out.println("==데이터 추가==");
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
// 첫 번째 항목에 추가 삭제
System.out.println("첫 번째 항목에 추가 삭제");
list.add(0, "d");
System.out.println(list);
list.remove(0);
System.out.println(list);
// 중간 항목에 추가, 삭제
list.add(1, "e");
System.out.println(list);
list.remove(1);
System.out.println(list);
}
}