- LinkedList란 Collection 프레임워크의 일부이며 java.util 패키지에 소속되어 있습니다
- 이 클래스는 데이터가 연속된 위치에 저장되지 않고 모든 데이터가 데이터 부분과 주소 부분을 별도로 가지고 있습니다. 데이터는 포인터와 주소를 사용하여 연결합니다.
- 중간에 데이터를 추가나 삭제하더라도 전체의 인덱스가 한 칸씩 뒤로 밀리거나 당겨지는 일이 없기에 ArrayList에 비해서 데이터의 추가나 삭제가 용이하나,
- 인덱스가 없기에 특정 요소에 접근하기 위해서는 순차 탐색이 필요로 하여 탐색 속도가 떨어진다는 단점이 있습니다.

1. LinkedList 선언하기
LinkedList li = new LinkedList();
// 타입 설정x Object로 입력
LinkedList<LinkedListDemo> demo = new LinkedList<LinkedListDemo>();
// List타입을 LinkedListDemo
LinkedList<Integer> i = new LinkedList<Integer>();
// int 타입으로 선언
LinkedList<Integer> i2 = new LinkedList<>();
// 타입 선언 생략도 가능
LinkedList<Integer> i3 = new LinkedList<Integer>(Arrays.asList(1, 2, 3));
// 초기 값 세팅
LinkedList<String> s = new LinkedList<String>();
// String 타입 사용
LinkedList<Character> ch = new LinkedList<Character>(); // Char 타입 사용
2. LinkedList 값 추가하기
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<String>();
ll.add("Hello");
ll.add("Hello");
ll.add(1, "World");
System.out.print(ll);
}
}

LinkedList<Integer> list = new LinkedList<Integer>();
list.addFirst(1);//가장 앞에 데이터 추가
list.addLast(2);//가장 뒤에 데이터 추가
list.add(3);//데이터 추가
list.add(1, 10);//index 1에 데이터 10 추가
3. LinkedList 값 삭제하기
LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2,3,4,5));
list.removeFirst(); //가장 앞의 데이터 제거
list.removeLast(); //가장 뒤의 데이터 제거
list.remove(); //생략시 0번째 index제거
list.remove(1); //index 1 제거
list.clear(); //모든 값 제거
4. LinkedList 값 변경하기
mport java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<String>();
ll.add("Hello");
ll.add("Hello");
ll.add(1, "World");
System.out.println(ll);
ll.set(1, "Hello");
System.out.println(ll);
}
}

5. LinkedList 크기 구하기
LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2,3));
System.out.println(list.size()); //list 크기 : 3
6. LinkedList 값 출력
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> ll = new LinkedList<String>();
/* 값을 추가한다 */
ll.add("Hello");
ll.add("World");
ll.add("Hello");
ll.add("World");
// get(i) 메서드를 사용하여 값 출력
for(int i = 0; i < ll.size(); i++)
System.out.print(ll.get(i) + " ");
System.out.println();
// for문을 사용하여 값 출력
for(String str : ll)
System.out.print(str + " ");
System.out.println();
// Iterator를 사용하여 값 출력
Iterator iter = ll.iterator();
while(iter.hasNext())
System.out.print(iter.next() + " ");
}
}
7. LinkedList 값 찾기
LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2,3));
System.out.println(list.contains(1));
//list에 1이 있는지 검색 : true
System.out.println(list.indexOf(1));
//1이 있는 index반환 없으면 -1
contains(Object) : LinkedList에서 값이 있는지 없는지 여부를 판단해 값이 있다면 true, 없다면 false를 반환 합니다.
indexOf(Object) : LinkedList에서 값이 없다면 -1을 반환하고,
값이 있다면 index 값을 리턴해줍니다.
퀴즈 : LinkedList는 노드간의 연결로 되어있고 각 노드에는 다음 노드를 지칭하는 정보가 담겨져있는 형태이다.
그렇다면 LinkedList의 중간 값을 삭제할 때 삭제된 노드는 여전히 다음 노드를 가리키고 있는데 이것은 어떻게 처리될까.
Array와 LinkedList의 삽입 삭제 접근의 동작을 시간복잡도와 연관지어 비교해 보자.
참고 자료
https://crazykim2.tistory.com/566
https://coding-factory.tistory.com/552