LinkedList 클래스는 ArrayList와 다른 점이 있다.
ArrayList는 데이터들이 순서대로 쭉 늘어선 배열의 형식을 가지고 있지만, LinkedList의 경우 순서대로 늘어선 게 아니라 자료의 주소 값으로 서로 연결되는 구조를 하고 있다고 볼 수 있다.(C의 포인터 개념)
LinkedList의 장점은 몇 개의 참조자만 바꿈으로 새로운 자료의 삽입이나 기존 자료를 위치에 관계없이 빠르게 수행할 수 있다는 장점이 있다.
ArrayList 및 List 관련해서는 아래 글을 참조하면 된다.
2023.02.05 - [프로그래밍/JAVA 프로그래밍] - Java - List 클래스
add
add 메서드는 ArrayList와 같이 뒤에 붙여주는 거로 사용된다.
실제로는 위 사진과 같이 마지막 노드 뒤에 첫 번째 노드를 연결해서 수행하겠지만, 실제로 우리가 볼 수 있는 값은 뒤에 연결돼서 보이도록 되어있다.
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<>();
ll.add("test");
ll.add("temp");
ll.add("추가");
System.out.println(ll);
}
}
맨 뒤로 추가되는 방법과, 지정해서 넣어주는 방법이 있다.
넣을 값 앞에 인덱스 번호를 넣어주면 된다.
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<>();
ll.add("test");
ll.add("temp");
ll.add("추가");
ll.add(0,"새치기");
System.out.println(ll);
}
}
그럼 안에 있는 글자를 바꾸고 싶을 땐 어떻게 해야 할까?
set
set이라는 메서드를 이용하면 된다.
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<>();
ll.add("test");
ll.add("temp");
ll.add("추가");
ll.add(0,"새치기");
ll.set(1,"변경");
System.out.println(ll);
}
}
보이는 것과 같이 test는 사라지고 변경이라는 단어로 변경되었다.
값을 삭제하는 방법도 있다.
remove / clear
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<>();
ll.add("test");
ll.add("temp");
ll.add("추가");
ll.add(0,"새치기");
ll.set(1,"변경");
ll.remove(2);
System.out.println(ll);
ll.clear();
System.out.println(ll);
}
}
remove의 경우 인덱스 번호에 해당하는 글자를 삭제하며, clear는 전체 삭제가 가능하다.
또한 LinkedList는 List형이기 때문에 for each문이 적용이 된다.
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<>();
ll.add("test");
ll.add("temp");
ll.add("추가");
ll.add(0,"새치기");
ll.set(1,"변경");
for(String temp : ll)
System.out.print(temp + " ");
System.out.println();
Iterator<String> it = ll.iterator();
while(it.hasNext())
System.out.print(it.next() + " ");
System.out.println();
ll.forEach(System.out::print);
}
}
만약 그 값이 존재하는지 여부를 알고 싶다면 어떻게 해야 할까?
contains / indexOf
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<>();
ll.add("test");
ll.add("temp");
ll.add("추가");
ll.add(0,"새치기");
ll.set(1,"변경");
System.out.println(ll.contains("test"));
System.out.println(ll.contains("추가"));
System.out.println(ll.indexOf("test"));
System.out.println(ll.indexOf("추가"));
}
}
conteins는 값이 존재하면 true / 없다면 false 반환하며,
indexOf 같은 경우 List안에 해당하는 값이 있다면 그 위치번호를 반환, 없다면 -1을 반환하게 됩니다.
만약 하나만 출력하고 싶다면?
그리고 사이즈를 알고 싶다면?
get / size
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<>();
ll.add("test");
ll.add("temp");
ll.add("추가");
ll.add(0,"새치기");
ll.set(1,"변경");
System.out.println(ll.get(2));
System.out.println(ll.size());
}
}
또한 LinkedList는 자료구조에서 주소 값으로 연결되는 구조이기 때문에 push라던지 pop기능이 사용이 됩니다.
push / pop
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<>();
ll.add("test");
ll.add("temp");
ll.add("추가");
ll.add(0,"새치기");
ll.set(1,"변경");
ll.push("맨앞에 넣자");
System.out.println(ll);
System.out.println(ll.pop());
System.out.println(ll);
}
}
우선 push 기능은 맨 앞에 추가를 하게 된다.
push pop 같은 경우엔 자료구조의 stack 같은 개념인데, 자료구조형에 대해서 다음에 정리하도록 하겠다.
pop 기능은 맨 앞에 있는(stack구조형이기 때문에 선입선출) 글자를 가져오게 된다.
이후 pop 기능이 꺼내는 기능이기 때문에 stack에서 삭제하게 된다. (정확히는 해당 인덱스를 삭제한다고 봐야 한다.)