[Java] LinkedList

2023. 1. 5. 17:19기술 창고/Java

728x90
SMALL

LinkedList는 각각의 노드를 연결하는 방식의 자료구조이다.
각각의 노드들은 데이터와 함께 다음 노드와 이전 노드 값을 내부적으로 가지고 있다. (이중형 연결 리스트)
어느 위치에서든 추가나 삭제를 할 경우 변경되는 노드만 다시 연결해주면 된다.
그래서 ArrayList는 주로 검색이 많은 경우에 사용하고 LinkedList는 잦은 삽입/삭제 작업이 발생할 때 사용한다.


LinkedList 사용

import java.util.*;

public class TestMain {
    public static void main(String[] args) {
     
        // LinkedList 생성 / 초기화
        LinkedList<String> linklist = new LinkedList<>();

        // LinkedList 자원 추가
        linklist.add("메시");
        linklist.add("티아고");
        linklist.add(0,"데용");
        linklist.add("레반도프스키");

        System.out.println(linklist);

        // LinkedList 자원 변경
        linklist.set(0,"하피냐");

        System.out.println(linklist);

        // LinkedList는 값을 찾아갈 때 처음부터 순차적으로 찾아간다.
        // 그래서 값 추가 시 순차적으로 탐색할 것 같지만 그렇게 동작하지 않는다.
        // 내부적으로 last라는 변수가  마지막 노드를 가리키고 있어서 이 변수에 바로 연결한다.
        // 그렇기 때문에 끝 부분에 추가할 떄는 순차적인 탐색없이 바로 마지막에 연결한다.

        // ArrayList의 경우
        ArrayList<String> arrayList = new ArrayList<>();

        arrayList.add("메시");
        arrayList.add("티아고");
        arrayList.add(0,"데용");
        arrayList.add("레반도프스키");

        System.out.println(arrayList);

        arrayList.set(0,"하피냐");

        System.out.println(arrayList);

        // ArrayList로 동일한 동작을 수행했을 때 시간이 더 걸린다.
        // 왜냐하면, 마지막 노드를 가리키는 Last 변수 덕분에 LinkedList는 바로 마지막 노드로 가서 탐색 후 반영하지만
        // ArrayList는 노드로 구성되어 있지 않기 때문에 추가 작업을 하게 되면 처음부터 순차적으로 올라가서 반영해야하기 떄문이다.

        // LinkedList 자원 삭제
        // remove()로 지울 수 있다.
        // 지우고자 하는 인덱스값을 넣어주거나, 값을 직접 입력해서 삭제가 가능하다.
        // 인덱스값을 넣어서 삭제를 하게 된다면, 삭제하고자 하는 인덱스 값을 변수에 담아서 추가 작업을 진행할 수 있다.
        String removeplayer = linklist.remove(0);
        System.out.println(removeplayer);

        linklist.remove("하피냐");
        System.out.println(linklist);

        // clear() 명령어로 전부 삭제 가능하다.
        linklist.clear();
        System.out.println(linklist);

        // LinkedList 전체 값 조회
        LinkedList<String> colors = new LinkedList<>(Arrays.asList("Black", "White", "Green", "Red"));

        // for-each문
        for (String color : colors) {
            System.out.print(color + "  ");
        }
        System.out.println();

        // for문
        for (int i = 0; i < colors.size(); ++i) {
            System.out.print(colors.get(i) + "  ");
        }
        System.out.println();

        // iterator 사용
        Iterator<String> iterator = colors.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + "  ");
        }
        System.out.println();

        // listIterator 사용 (역순으로 조회)
        ListIterator<String> listIterator = colors.listIterator(colors.size());
        while (listIterator.hasPrevious()) {
            System.out.print(listIterator.previous() + "  ");
        }
        System.out.println();


        // 값 존재 유무 확인
        // contains는 존재 유무를 알려주면서 boolean 타입 값을 반환한다.
        boolean contains = colors.contains("Black");
        System.out.println(contains);

        // indexOf는 값이 존재하지 않으면 -1, 존재하면 위치값을 알려준다.
        int index = colors.indexOf("Blue");
        System.out.println(index);

        index = colors.indexOf("Red");
        System.out.println(index);
    }
}​

 

728x90
반응형
LIST