연결 리스트 

연결 리스트는 내부에 노드헤더를 갖는다.

노드는 데이터를 갖고 다음 노드의 주소값을 알고있다.

 


자바로 단방향 연결 리스트 구현

자바로 단방향 연결 리스트를 구현해보았다. 자료구조의 개념을 익히기 위함이라 완벽한 구현은 아닐수도 있다.

간단하게 내부 클래스로 Node 를 만들고 연결 리스트의 추가, 삭제, 조회 메서드를 구현했다.

첫 생성 시엔  다음 노드의 주소값의 초기값을 null 로 줘서 다음 주소값을 모르도록 설정했다.

연결 리스트를 생성하는 시점에 첫 노드로서 헤더를 만들고 생성, 삭제, 조회 시 헤더가 이 메서드들의 반복문의 시작점이 된다.

조회 시 헤더를 조회 할 필요는 없으므로 헤더의 다음 노드부터 조회한다.

public class LinkedList {
    Nodes header;

    public LinkedList() {
        header = new Node();
    }

    // 추가
    void append(int d) {
        Node end = new Node(d);
        Node n = header;
        while (n.next != null) {
            n = n.next;
        }
        n.next = end;
    }

    // 삭제
    void delete(int data) {
        Node n = header;
        while (n.next != null) {
            if (n.next.data == data) {
                n.next = n.next.next;
            } else {
                n = n.next;
            }
        }
    }

    // 조회
    void retrieve() {
        Node n = header.next;
        while (n.next != null) {
            System.out.print(n.data + " -> ");
            n = n.next;
        }
        System.out.println(n.data);
    }

    public static class Node {
        int data;
        Node next = null;

        public Node() {
        }

        public Node(int data) {
            this.data = data;
        }
    }
}

ㄴ append()

데이터 값을 매개변수로 받아 그 데이터로 마지막 노드를 만들고

처음부터 반복문을 돌아서 이전 마지막 노드를 찾아 그 노드에 새로 만든 마지막 노드의 주소값을 할당한다.

ㄴ delete()

데이터 값을 매개변수로 받아 반복문을 돌아 그 데이터에 해당하는 목표 노드를 찾는다.

a -> b -> c 순서의 노드 중 b 가 목표 노드라면 a 노드 에는 c 노드 주소를 할당한다.

ㄴ retrieve()

조회 시에는 header 의 데이터값을 조회 할 필요는 없으므로 header 의 다음 노드부터 시작해서

다음 노드 주소가 null 인 노드(마지막 노드) 까지 값을 출력한다.

 

LinkedList 클래스에 아래처럼 메인 메서드를 작성하면 제대로 동작함을 알 수 있다.

public static void main(String[] args) {
    LinkedList linkedList = new LinkedList();
    linkedList.append(1);
    linkedList.append(2);
    linkedList.append(3);
    linkedList.append(4);
    linkedList.append(5);
    linkedList.retrieve();
    linkedList.delete(1);
    linkedList.delete(4);
    linkedList.retrieve();
}

 

'알고리즘 > 자료구조' 카테고리의 다른 글

[자료구조] LinkedList  (0) 2023.10.02

LinkedList(연결 리스트) 란

컴퓨터에 자료를 저장하는 자료구조의 한 종류이다.

길이가 정해져있지 않으며 데이터를 저장한 노드에서 이전 노드가 다음 노드의 주소를 가지고있는 구조이다.

 

배열과의 비교 

1. 배열

배열방들이 물리적으로 연결돼있어서 크기를 정하면 늘이거나 줄일수없다.

2. 연결 리스트

노드가 갖고 있는 주소를 변경하면 늘이거나 줄일 수 있다.

하지만 메모리는 여전히 갖고있기 때문에 자바같이 사용하지 않는 메모리를 알아서 정리해주 언어가 아니면

안쓰겠다고 명시해줘야 다른 애들이 그 메모리를 쓸수있다.

 

연결 리스트는 조회 시 배열보다 속도는 느리지만 배열은 크기 변경 시 변경사항을 적용한

배열을 통째로 다시 값을 할당해줘야하므로 길이가 정해지지 않은 데이터 핸들링엔 연결 리스트가 좋다.

 

연결 리스트 단/양방향

내 다음 노드 주소만 알고있어서 조회 시 앞에있는 노드애부터 하나씩 조회해야하면 단방향이다.

내 다음 노드와 이전 노드의 주소도 알고 있어서 양쪽으로 조회 가능하면 양방향이다.

양방향은 내 다음 노드와 이전 노드의 주소값 모두 알아야하므로 단방향보다는 메모리를 많이 먹는다.

따라서 양방향 조회가 필요 없으면 단방향으로 하고 필요하면 양방향으로 유연하게 선택하자.

 

 

'알고리즘 > 자료구조' 카테고리의 다른 글

[자료구조] LinkedList 구현해보기  (0) 2023.10.02

레벨 0 도장깨기 끝

코딩 테스트를 공부해야겠다고 생각한지 약 2주정도가 지났다.

프로그래머스 레벨 0짜리 200개 정도 되는 문제를 이제야 다 풀었다.

레벨 0이라고 기초 트레이닝이니 입문이니 해서 쉬울거라고 생각했는데 생각보다 어려운건 어렵더라.

처음엔 배열만 봐도 머리 아프고 2차원 배열 보이면 기절할것 같았는데 공부해보니까 할만한듯.

풀다보니 시간도 잘가고 특히 코테 기본기 익히는데에는 도움이 많이 됐다.

덕분에 자료구조 공부도 하면서 배열, 리스트, 스택, 맵, 셋 도 써봤다.

레벨 0 올클 인증샷은 사진이 커서 아래에 접어뒀다.

 

느낀점

0레벨은 딱 쉬운건 쉬웠고 어려운건 어려웠다는게 완주 후 느낀점이다.

200문제 정도 되는것 중에 대부분은 쉬웠고 보자마자 바로 풀리는것도 많았지만

어려운건 한 문제가지고 하루 종일 붙잡아본 문제도 있었다.

 

제일 어려웠던건 기초 트레이닝의 배열 만들기 2.

이거 하루 종일 풀다가 코테 때려칠까 고민만 수천번 한것 같다.

전형적인 머릿속으로 푸는 방법은 떠오르는데 구현을 못해서 머리 싸맨 케이스.

포기하고 답 보면 쉽겠지만 레벨 0이니까 시간 좀 써서 기본기 진득하게 익히고 가도 되지 않을까 싶었다.

그래서 이리저리 이렇게하면 되지 않을까 저렇게하면 되지 않을까 하루종일 붙잡았던것 같다.

 

이제 레벨 1 이상 문제도 풀어보고 레벨 1, 2 정도 풀 줄 알면 백준도 해봐야겠다.

레벨 0도 꽤 오래 걸렸는데 레벨 1, 2는 얼마나 어려울까 걱정도 되지만 그래도 해봐야지 어쩌겠어.

레벨 0이라 그런가 레벨 1 이상은 다를지 모르겠는데 아직 시간복잡도나 공간복잡도는 크게 와닿지는 않는다.

이건  자료구조들 한번쯤 자바 코드로 직접 구현도 해보면 도움이 많이 될것같다.

날잡고 꼭 한번 해봐야지.

코테 공부 시작

요즘 코딩 공부를 다시 시작하면서 코딩테스트 공부의 필요성을 느꼈다.

사실 항해하던 시절엔 스프링만 잘 쓰면 되지 코테가 필요한가? 싶었던게 사실이다.

당시엔 자바 이해도도 부족했고 스프링은 더더욱 몰랐으니 스프링 공부 시간도 모자란데

한 문제 한 문제 오래 걸리는 코테를 공부할 시간도 아깝고 공부해야할 필요성도 못느꼈다.

 

그런데 왜 코딩테스트?

한동안 코딩을 손 놓다시피 하다가 최근 다시 해보려니 생각이 좀 바뀌었다.

다시 코딩 공부를 시작하며 코테 공부가 필요하단걸 느낀건 3가지 이유 정도가 있다.

 

  1. 취직 시장이 넓어진다.
  2. 코딩 재활
  3. 자료구조 공부

 

1. 취직 시장이 넓어진다.

우선 채용 공고를 보면 코딩테스트를 보는 회사가 눈에 꽤 보인다. 이런 회사를 놓치는건 아깝다.

단순히 코테를 보는 회사까지 지원할 수 있다는 점도 있지만 좀 더 나은 개발자가 되고자 한다면

회사들이 코딩테스트를 보는 이유를 생각해보는것도 좋을것 같았다.

 

2. 코딩 재활

항해 수료한 이후로는 사실상 코딩을 손 놓다시피 했으니 필연적으로 익힌 지식의 많은 부분이 휘발됐다.

사실 한창 열심히 공부할 때도 스프링 위주로 공부했기 때문에 순수 자바 이해도는 그리 높지도 않았다.

그래서 필수적인 stream 문법 같은것도 공부하고, IntelliJ 도 다시 익숙해질 겸 코딩테스트를 공부하기로 했다.

 

3. 자료구조 공부

코딩 재활도 할 겸 자바로 코테를 연습하는데 프로그래머스 레벨 0에서부터 많은 어려움이 따랐다.

IDE 를 쓸 수 없다는 소리를 들어서 IDE 없이 문제를 풀려니 1차원 배열 쓰는것도 헤맸다.

 

그런 기본적인 문제 뿐 아니라 문제 분석 이후 풀이법을 구상해야하는데 자료구조를 모르니 그저 막막했다.

특히 배열만 나오면 포기하고 파이썬으로 코테 준비나 할까 싶은 생각부터 들었다. 

자바는 배열 크기를 바꾸려면 초기화하고 값을 재할당 하는 수 밖에 없다.
주어진 배열에서 조건에 맞는 원소를 제거해야 하는데, 제거할 때마다 배열을 초기화 해야하나? 싶었다.

 

그래서 도저히 이렇게는 안되겠다는 생각이 들었고 다른 사람들 문제 풀이를 보면서

Stack 이나 List, Set, Map  같은 자료구조를 찾아보고 이 자료구조의 특징을 알아보았다.

문제마다 필요한 자료구조를 생각해보고 적절한 자료구조를 이용하니 풀이 시간을 극적으로 줄일 수 있었다.

 

특히 List, Set, Map 은 구현체고 이를 구현한 HashSet, LinkedHashSet 같은 구현체가 있는걸 알았다.

순서를 보장하는 여부 등 이들의 특징과 구현 방법이 각각 다르니 한번 공부해봐야겠다.

+ Recent posts