반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 개인 프로젝트 개발일지
- 만다라트프로젝트
- i-20
- 비전공자 git
- 파이데이아창의인재학과
- jpa
- 개발일지
- 미국유학
- java
- 미국대학생활
- 복수학위제도
- 2+2
- California State University Sacramento
- 케네스로그
- Java 스터디
- 케네스
- 사이드프로젝트
- 자바 스터디
- 미국대학
- 유학생대학생활
- 자바
- 유학생 준비물
- 미국유학생활
- F1학생비자
- Kenneth Park
- JVM아키텍처
- 해외유학
- 부산외대
- CSUS
- 미국유학생
Archives
- Today
- Total
케네스로그
[자료구조/Java] LinkedList - 조회/추가/삭제 코드구현 본문
반응형
이전에 정적배열 Array와 동적배열 ArrayList에 대해 알아보았습니다. 이번에는 또 다른 동적배열인 LinkedList에 대해 알아보겠습니다.
LinkedList 링크드리스트
LinkedList는 Node를 기반으로 구성된 자료구조를 말하며, ArrayList와 마찬가지로 List클래스를 기반으로 합니다. Node는 Data를 담을 수 있는 변수와 다른 Node를 참조하는 2개의 변수로 이루어져있습니다.
LinkedList는 Node의 구성에 따라 싱글 링크드리스트(Single-LinkedList), 더블 링크드리스트(Double-LinkedList)로 구분할 수 있습니다.
- Single Linked List
- Double Linked List
Single Linked List
public class Node<T> {
public T data;
Node<T> next = null;
}
싱글 링크드리스트(Single LinkedList)는 각 노드가 다음 노드를 가르키는 형태로 구성됩니다.
싱글 링크드리스트의 단점은 리스트를 순회할 때, 이전의 노드로 이동할 수 없기때문에 단방향으로만 순회가 가능합니다. 이를 보완하기 위해서 고안된 것이 아래에 소개될 더블 링크드리스트입니다.
Double LinkedList의 Node
public class Node<T> {
public T data;
Node<T> prev = null;
Node<T> next = null;
}
더블 링크드리스트는 Node 내의 2개의 참조 변수가 이전과 다음 Node를 가리키게 되어있습니다. 마치 체인처럼 서로 연결되어 있는 형식이죠. 가장 처음과 끝 노드는 head, tail이라고 부릅니다.
LinkedList의 조회
public Node<T> search(T data){
Node<T> cursor = this.head;
while(cursor.data != data) {
if(cursor.next == null) {
System.out.println("search result: "+data+ " does not exist");
return null;
}
cursor = cursor.next;
}
return cursor;
}
LinkedList의 추가
LinkedList에 노드를 추가하기 위해서는 다음과 같은 순서를 따릅니다.
- 삽입하고자 하는 Node의 prev_node를 이전 노드를 참조하게 한다.
- 삽입하고자 하는 Node의 next_node를 다음 노드를 참조하게 한다.
- prev_node의 next_node를 삽입하고자 하는 Node를 참조하게 한다.
- next_node의 prev_node를 삽입하고자 하는 Node를 참조하게 한다.
특정 데이터 뒤에 새로운 데이터를 삽입하는 경우
// target데이터 노드 뒤에 새로운 데이터 노드 삽입
public void addNode(T newData, T target){
if(this.head == null) {
System.out.println("List is empty");
} else {
Node<T> cursor = this.search(target);
if(cursor.next == null) {
this.addNode(newData);
} else {
Node<T> newNode = new Node<T>(newData);
newNode.prev = cursor;
newNode.next = cursor.next;
cursor.next.prev = newNode;
cursor.next = newNode;
}
}
}
LinkedList의 가장 마지막에 데이터를 삽입하는 경우
// LinkedList의 마지막에 데이터 추가하기
public void addNode(T data){
if(this.head == null) {
this.head = new Node<T>(data);
this.tail = this.head;
} else {
Node cursor = this.tail;
cursor.next = new Node<T>(data);
cursor.next.prev = cursor;
this.tail = cursor.next;
}
}
LinkedList의 Node 삭제
LinkedList에 기존의 데이터를 삭제하기 위해서는 다음과 같은 순서를 따릅니다.
- 삭제되는 Node의 next_node의 prev_node를, 삭제되는 Node의 prev_node를 참조하게 한다.
- 삭제되는 Node의 prev_node의 next_node를, 삭제되는 Node의 next_node를 참조하게 한다.
- 삭제되어야 하는 Node를 삭제한다.
// 특정 값을 지닌 노드 삭제. 해당 노드가 존재하지 않으면 false, 삭제성공 시 true 반환
public boolean delNode(T data) {
if(this.head == null) {
System.out.println("list is empty");
return false;
}
if(this.head.data == data) {
this.head = this.head.next;
this.head.prev = null;
return true;
}
Node<T> cursor = this.search(data);
if(cursor.next == null) {
cursor.prev.next = null;
cursor.prev = null;
return true;
}
cursor.prev.next = cursor.next;
cursor.next.prev = cursor.prev;
return true;
}
전체 코드는 개인 깃허브(이곳)에서 확인가능합니다.
반응형
'Dev > 자료구조' 카테고리의 다른 글
[자료구조/Java] 이진탐색트리 - 탐색/삽입/삭제 (0) | 2022.01.24 |
---|---|
[자료구조/Java] Hash 해시 (0) | 2022.01.21 |
[자료구조/Java] Stack (Java구현, 관련 메소드) (0) | 2022.01.02 |
[자료구조/Java] Queue (Java구현, 관련 메소드) (0) | 2021.12.28 |
[자료구조/Java] ArrayList (0) | 2021.12.27 |