728x90
반응형
[Java] 리스트
리스트(list)
- 기본적인 연산: 삽입, 삭제, 검색 등
- 리스트를 구현하는 대표적인 두가지 방법: 1) 배열, 2) 연결리스트
배열
- 크기가 고정 - reallocation 필요
- 리스트의 중간에 원소를 삽입하거나 삭제할 경우 다수의 데이터를 옮겨야함
연결리스트
- 다른 데이터의 이동없이 중간에 삽입이나 삭제가 가능하며 길이의 제한이 없음
- but, 랜덤 액세스 불가 ( 배열의 index로 접근하는 것을 의미 )
연결리스트의 노드
- 각각의 노드는 "데이터 필드"와 하나 혹은 그 이상의 "링크 필드"로 구성
- single Linked - 단방향( 뒷 노드의 주소 ) / doubley linked - 양방향( 앞, 뒤 노드의 주소 )
- 링크 필드는 다음 노드를 참조
- 첫 번째 노드의 주소는 따로 저장되어야함
연결리스트 구현코드
Node.java
public class Node<T> {
public T data;
public Node<T> next;
public Node(T item){
this.data=item;
this.next=null;
}
}
MySingleLinkedList.java
public class MySingleLinkedList<T> {
public Node<T> head;
public int size = 0;
public MySingleLinkedList(){
head=null;
size=0;
}
public void addFirst( T item ){
Node<T> newNode = new Node<T>(item);
newNode.next = head;
head = newNode;
size++;
}
public void addAfter(Node<T> before, T item) {
Node<T> temp = new Node<T>(item);
temp.next = before.next;
before.next=temp;
size++;
}
public T removeFirst() {
if (head == null) {
return null;
}else{
T temp=head.data;
head = head.next;
size--;
return temp;
}
}
public T removeAfter(Node<T> before){
if(before.next==null){
return null;
}else{
T temp=before.next.data;
before.next=before.next.next;
size--;
return temp;
}
}
public void add(int index, T item) { // insert
if (index < 0 || index > size) {
return;
}
if (index == 0) {
addFirst(item);
}else{
Node<T> node = getNode(index-1);
addAfter(node, item);
}
}
public T remove(int index){ // delete
if (index < 0 || index > size) {
return null;
}
if (index == 0) {
return removeFirst();
}else{
Node<T> prev = getNode(index-1);
return removeAfter(prev);
}
}
public T remove(T item) {
Node<T> p=head;
Node<T> q=null;
while (p != null && p.data.equals(item)) {
q = p;
p = p.next;
}
if (p == null) {
return null;
}
if (q == null) {
return removeFirst();
}else{
return removeAfter(q);
}
}
public Node<T> getNode(int index) {
if (index < 0 || index >= size) {
return null;
}
Node<T> p=head;
for (int i = 0; i < index; i++) {
p = p.next;
}
return p;
}
public T get(int index){
if (index < 0 || index >= size) {
return null;
}
return getNode(index).data;
}
public int indexOf(T item){ //search
Node<T> p = head;
int index = 0;
while (p != null) {
if (p.data.equals(item)) {
return index;
}
p = p.next;
index++;
}
return -1;
}
public static void main(String[] args) {
MySingleLinkedList<String> list = new MySingleLinkedList<String>();
list.addFirst("Monday");
list.addFirst("Sunday");
list.add(2, "Saturday");
list.add(2, "Friday");
list.remove("Friday");
int index = list.indexOf("Saturday");
}
}
728x90
반응형
'Programing > Java' 카테고리의 다른 글
[Java] 이중연결리스트와 ListIterator 인터페이스 (0) | 2021.01.13 |
---|---|
[Java] Iterator (0) | 2021.01.13 |
[Java] List 관련 메서드 (0) | 2021.01.04 |
[Java] Generic Programming (0) | 2021.01.04 |
[Java] 추상클래스와 인터페이스 (0) | 2020.12.28 |