티스토리 뷰
List
- 선형 자료구조
- 순서를 가진 항목들의 모임
- 배열이 가지고 있는 인덱스라는 장점을 버리고 빈틈없는 데이터 적재라는 새로운 장점을 취한 자료구조
- 중복된 데이터의 저장 허용
- ArrayList , LinkedList등 여러 인터페이스를 구현한 자료형이 있다
- 자바스크립트,파이썬 같은 경우에는 리스트를 따로 구현하지 않고 배열에 List의 기능 중 일부를 제공
- List에서는 인덱스가 중요하지 않다
- 리스트의 핵심은 element간의 순서
- 다른말로 순서라는 의미의 시퀀스(sequence)라고도 함
- 수학적으로 유한수열을 표현한 것
기능(operation)
- 처음,끝에 데이터 삽입기능
- 리스트에 데이터가 있는지를 체크하는 기능
- 리스트의 모든 데이터에 접근할 수 있는 기능
위와 같은 기능을 가지고 있고 순서가 있으면서 중복이 허용되는 자료구조를 리스트(List)라고 함
Java 에서의 List
*자바8의 API 문서에서 List를 검색한 결과
- java.util 패키지의 하위 인터페이스
- Collection<E> 인터페이스와 Iterable<E> 인터페이스를 구현함
- 하위 클래스로 사진 맨밑에줄에 있는 클래스들을 가짐 ....
- 가장 중요한 클래스 : ArrayList , LinkedList
1 ArrayList
- 배열을 이용해서 리스트를 구현한 것을 의미
- 장점 : 내부적으로 배열을 이용하기 때문에 인덱스를 이용하여 접근하는 것이 빠름
- 단점 : 데이터의 추가/삭제가 느림
- 내부적으로 데이터를 배열에 저장 하므로 배열의 특성상 데이터를 리스트의 처음이나 중간에 저장하면 이후의 데이터들이 한칸씩 뒤로 물러나야 함
- 삭제 : 빈자리가 생기면 빈자리를 채우기 위해서 순차적으로 한 칸씩 땡겨야 함
- 데이터 가져오기 : 인덱스를 이용하기 때문에 메모리상의 주소를 정확하게 참조 하므로 속도가 매우 빠름
생성
import java.util.ArrayList ; // import
ArrayList<> list = new ArrayList<>() ;
추가
- 제네릭 타입을 선언한다면 해당 타입만 추가가능
- 기본적으로 리스트의 맨 뒤에 데이터 추가
- 특정 인덱스를 선택해 해당 위치에 데이터 추가 가능
- 데이터를 추가하는 과정에서 내부적으로 사용하는 배열이 꽉차면 기존의 배열 대비 2배 큰 새로운 배열을 만들고 기존의 데이터를 새로운 배열로 복제
- 사용자는 ArrayList의 크기에 신경쓰지 않고 편리하게 프로그램을 만들 수 있다
list.add(1234); // list라는 ArrayList 맨뒤에 1234 라는 int타입 데이터를 추가
list.add(9083); // list라는 ArrayList 맨뒤에 9083 라는 int타입 데이터를 추가
list.add("hello java"); // list라는 ArrayList 맨뒤에 "hello java" 라는 String타입 데이터를 추가
list.add(1,50) ; // 1이라는 인덱스에 50이라는 값을 추가
삭제
list.remove(2) ; // list의 3번째 데이터를 삭제 ( 항상 배열,리스트의 인덱스는 0부터 시작 )
가져오기
list.get(20) ; // 인덱스가 20인 데이터를 가져옴
반복
- 자바에서는 ArrayList를 탐색하기 위한 방법으로 iterator를 제공
- 객체지향 프로그래밍에서 사용하는 방법 기법
- 먼저 Iterator 객체 생성
Iterator it = list.iterator( ) ; // iterator 객체는 list객체의 iterator( ) 메소드를 통해 생성
while(it.hasNext()){ // 다음 엘리먼트가 존재하면 while문 반복
System.out.println(it.next()); // 다음 엘리먼트를 출력
if(it.next() = 1234){ // 다음 엘리먼트가 1234 라면
it.remove(); // 해당 엘리먼트 삭제
}
};
2 LinkedList
- element간 연결(link)을 통해서 리스트를 구현한 것
- 노드(node or vertex)가 사용됨
- head(첫번째 node)와 tail(마지막 node)
- 메모리 제한이 없다
- 자료의 순서를 유지한 채 삽입과 제거가 쉽다
사진 출처: 생활코딩 egoing님 자료구조 강좌(https://opentutorials.org/module/1335/)
노드(Node)
- 노드는 두가지 정보를 가진다
- 노드의 값 (data)
- 다음 노드를 가르키는 참조 값 (next)
Node 구현
LinkedList클래스에서 Node객체와 해당 변수를 사용해야 하므로 public 으로 선언했지만 리스트의 내부부품의 의미로 사용하기 위해서는 Node를 LinkedList의 내부 클래스로 생성하는 것이 더 좋은 방법일 것 같다
( 아래에 제공된 소스에는 수정해서 첨부 했어요 )
LinkedList 또한 자바 내장 객체로 지원되지만 직접 LinkedList 의 기능들을 구현해 보았다
추가
1) 처음에 추가하기
- head를 새로운 node로 교환하는 것
- 새로운 node의 next를 기존 head로 설정하고 head를 새로운 node로 설정
- 리스트의 크기 증가
- 만약 기존 head가 없다면 head인 동시에 tail로 설정 (or 리스트의 크기가 1이면 head==tail )
2) 마지막에 추가하기
- 새로운 노드를 만들어 tail의 next로 설정
- 다시 새로운 노드를 tail로 설정
- 리스트의 사이즈가 0이면 head에 붙이는 것과 동일
3) 중간에 추가하기
- 추가 하고자 값과 함께 추가 하고자 하는 인덱스를 매개변수로 받는다
- 매개변수로 받은 인덱스가 0이면 head에 추가한다
- 매개변수로 받은 인덱스가 0이 아니면 추가하고자 하는 인덱스의 앞 노드를 임시노드에 받아둔다
- 새 노드의 next를 임시노드의 next로 설정한다
- 임시노드의 next를 새 노드로 설정한다
- 크기 값을 증가시켜준다
LinkedList 소스는 아래 ZIP파일
'Development > 자료구조&알고리즘' 카테고리의 다른 글
[자료구조] 큐(Queue) (0) | 2017.11.02 |
---|---|
[자료구조] 스택(Stack) (0) | 2017.11.02 |
[자료구조] 추상자료형(ADT) (0) | 2017.08.31 |
[자료구조] 배열(Array) (0) | 2017.08.30 |
[자료구조/알고리즘] 퀵정렬(quick sort) (0) | 2017.08.22 |
- Total
- Today
- Yesterday
- springframewor
- mysql데이터타입
- Stack
- 해시알고리즘
- hash algorithm
- 데크
- mariadb설치
- mariadb 데이터타입
- 자료구조
- mariadb
- 스택
- 큐
- mysql 데이터 타입
- mysql 세팅
- mac mariadb 설치
- org.springframework.beans.factory.BeanDefinitionStoreException
- spring boot org.springframework.beans.factory.BeanDefinitionStoreException
- mac mariadb
- hash알고리즘
- mac db설치
- 알고리즘
- 스프링 부트 에러
- 400 badgateway
- spring boot 시작 에러
- mariadb데이터 타입
- HTTP
- mysql데이터
- 400 error
- 스프링 부트 시작 에러
- Data Structure
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |