[Java] 자바 LinkedList(링크드 리스트) 사용법, 구현 및 초기화 방법

자바 LinkedList에 대해서 궁금하신가요?? 자바 LinkedList는 List 인터페이스와 Queue 인터페이스의 구현체이고 노드라는 객체로 이루어져 있습니다. 그럼 바로 자바 LinkedList란 무엇이고 선언, 데이터 추가, 변경, 삭제 방법, ArrayList와 차이에 대해서 알아보겠습니다.


목차


자바 LinkedList란??

LinkedList

자바 LinkedList는 Collection 프레임워크의 일부입니다. 자바 LinkedList는 연속된 위치에 저장되지 않습니다. 자바 LinkedList는 노드로 이루어져있는데 이 노드는 데이터 부분주소 부분을 별도로 가지고 있습니다. LinkedList에 객체를 추가하거나 삭제하면 앞, 뒤 주소만 변경되고 나머지는 변경되지 않는다는 장점이 있습니다. 그러나 인덱스가 없기 때문에 특정 요소에 접근하기 위해서는 순차 탐색이 필요하므로 탐색 속도가 떨어진다는 단점이 있습니다.


자바 LinkedList 사용법


LinkedList 선언

1
2
3
4
LinkedList list1 = new LinkedList(); // Object타입으로 선언
LinkedList<Integer> list2 = new LinkedList<Integer>(); // int 타입으로 선언
LinkedList<Integer> list3 = new LinkedList<>(); // 타입 선언 생략 가능
LinkedList<Integer> list4 = new LinkedList<Integer>(Arrays.asList(123)); // 선언 및 초기화
cs

자바 LinkedList 선언 방식은 ArrayList와 같지만 LinkedList는 초기의 크기를 미리 설정할 수 없습니다. LinkedList를 생성할 때 new LinkedList<>()와 같이 타입을 생략 가능하지만 되도록이면 LinkedList에 사용 타입을 명시해 주는 것이 좋습니다.


LinkedList 데이터 추가

LinkedList 데이터 추가

  • add(Object) : 데이터 추가
  • add(int index, Object) : index 위치에 데이터 추가
  • addFirst(Object) : 가장 앞에 데이터 추라
  • addLast(Object) : 가장 뒤에 데이터 추가

1
2
3
4
5
6
7
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(2);//데이터 추가
list.addFirst(1);//가장 앞에 데이터 추가
list.addLast(3);//가장 뒤에 데이터 추가
list.add(15);//index 1에 데이터 5 추가
 
System.out.println(list);
cs

<결과>

LinkedList 데이터 추가 결과

LinkedList 데이터 변경

  • set(int index, Object) : index 위치에 데이터 변경

1
2
3
4
5
6
7
8
9
10
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(2);//데이터 추가
list.addFirst(1);//가장 앞에 데이터 추가
list.addLast(3);//가장 뒤에 데이터 추가
list.add(15);//index 1에 데이터 5 추가
System.out.println(“기존 데이터 : “ + list);
         
list.set(23); // index 2에 데이터를 3으로 변경
         
System.out.println(“데이터 변경 후 : “ + list);
cs

<결과>

LinkedList 데이터 변경

LinkedList 데이터 삭제

LinkedList 데이터 삭제

  • remove() : 첫 번째 데이터 삭제
  • remove(Object) : Object 삭제
  • removeFirst(): 첫 번째 데이터 삭제
  • removeLast(): 마지막 데이터 삭제
  • clear() : 전체 데이터 삭제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Main {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(2);//데이터 추가
        list.addFirst(1);//가장 앞에 데이터 추가
        list.addLast(3);//가장 뒤에 데이터 추가
        list.add(15);//index 1에 데이터 5 추가
        System.out.println(list);
        
        list.remove(3); //데이터 3 삭제
        System.out.println(list);
        
        list.removeFirst(); //첫 번째 데이터 삭제
        list.removeLast(); //마지막 데이터 삭제
        System.out.println(list);
        
        list.clear(); // 전체 데이터 삭제
        System.out.println(list);
    }
}
 
cs

<결과>

LinkedList 데이터 삭제 결과


LinkedList 데이터 검색

  • contains(Object) : LinkedList에 Object가 있는지 검색 , 찾으면 true
  • indexOf(Object) : LinkedList에 Object가 있는 index 반환 , 없으면 -1 반환

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(2);
        list.add(1);
        list.add(3);
        list.add(5);
        System.out.println(list);
             
        System.out.println(“데이터 3이 있는가??(contains) : “ + list.contains(3));
        System.out.println(“5의 index는??(IndexOf) : “ + list.indexOf(5));       
    }
}
cs

<결과>

LinkedList 데이터 검색 결과

LinkedList 데이터 출력

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
public class Main {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(2);
        list.add(1);
        list.add(3);
        list.add(5);
             
        System.out.println(list); // 기본 출력
        
        // get(i)를 사용하여 값 출력
        for(int i = 0; i < list.size(); i++)
              System.out.print(list.get(i) + ” “);
        
        System.out.println();
        
        // 향상된for문을 사용하여 값 출력
        for(Integer i : list)
            System.out.print(i + ” “);
        
        System.out.println();
        
        // Iterator 사용 값 출력
        Iterator iter = list.iterator();
        while(iter.hasNext())
              System.out.print(iter.next() + ” “);
        
        System.out.println();
        
        // forEach()메소드를 통해 출력( 자바 8부터 사용할 수 있다)
        list.forEach(i > System.out.print(i + ” “));    
    }
}
cs

<결과>

LinkedList 데이터 출력 결과

자바 LinkedList를 출력하는 방법에는 get(int index) 메소드를 이용하는 방법, 향상된 for문을 이용하는 방법, Iterator를 사용하는 방법, forEach() 메소드(자바 8이상)를 사용하는 방법이 있습니다.


LinkedList vs ArrayList

  • LinkedList
    요소가 “노드“라는 개체에 저장되고 각 노드가 다음 노드의 주소를 알고있는 선형 데이터 구조입니다. 요소를 쉽게 재배열할 수 있으므로 효율적인 삽입 및 삭제 작업을 허용합니다.
  • ArrayList
    요소가 추가되거나 제거될 때 크기가 커지거나 줄어드는 동적 배열을 나타냅니다. LinkedList와 달리 ArrayList의 요소는 인접한 메모리 위치에 저장되므로 해당 인덱스로 요소에 더 빠르게 액세스할 수 있습니다.

기능LinkedList ArrayList
데이터 구조포인터로 연결된 노드연속 메모리 할당이 있는 동적 배열
메모리 할당노드 포인터로 인한 더 많은 메모리 오버헤드추가 포인터 없이 적은 메모리 오버헤드
접속시간
(랜덤접속)
O(n)O(1)
액세스 시간
(순차적)
O(n)O(n)
삽입/삭제
(시작/끝)
O(1)O(1)
삽입/삭제
(가운데)
O(n/2) 또는 O(n)O(n)
공간 복잡성높다낮다
사용 사례빈번한 삽입 및 삭제에 적합빈번한 임의 액세스 및 반복에 적합

  • ArrayList에 대해서 더 궁금하시다면 여기를 클릭하세요

자바 LinkedList는 효율적인 삽입 및 삭제로 인해 대기열 구현 시스템이나, 빈번한 삽입/삭제 처리가 필요한 시스템에서 선호됩니다. 그러나 임의 액세스에 대한 성능은 ArrayList보다 열등하므로 데이터 구조를 선택하기 전에 응용 프로그램의 요구 사항을 신중하게 고려해야 합니다.

자바 추가 정보

  • Vector에 대해서 궁금하시다면 여기를 클릭해 주세요.
  • List 인터페이스에 대해서 궁금하시다면 여기를 클릭해 주세요.
  • Set 인터페이스에 대해서 궁금하시다면 여기를 클릭해 주세요.
  • 참고

Leave a Comment