JAVA Linkedlist 그림으로 원리 이해하기
by 효기’s
package LinkedListTest;
public class LinkedList {
private Node head;
private Node tail;
private int size = 0;
private class Node {
private Object data;
private Node next;
public Node(Object input) { // 값이 input에 매개변수로 전달됨.
this.data = input;
this.next = null;
}
public String toString() { // 객체를 보기 편하게 (노드의 데이터값을 보기편하게)
return String.valueOf(this.data);
}
}
// 노드를 앞에 넣기
public void addFirst(Object input) {
Node newNode = new Node(input);
newNode.next = head; // 새로 만들어진 노드가 기존 노드를 가리킴(헤드가 가리키는 방향을 가리킴)
head = newNode; // 새로만들어진 노드값이 해드가됨
size++;
if (head.next == null) {
tail = head;
}
}
// 노드를 뒤에 넣기
public void addLast(Object input) {
Node newNode = new Node(input);
if (size == 0) { // 데이터가 없는 상태라면
addFirst(input); // 앞쪽에 넣던 뒤에넣던 같음
} else {
tail.next = newNode;
tail = newNode;
size++;
}
}
// 중간에 추가
Node node(int index) {
Node x = head;
for (int i = 0; i < index; i++) { // index를 받아와서 그만큼 next를 진행해서 호출
x = x.next;
}
return x;
}
// 인덱스 값으로 값 넣기
public void add(int k, Object input) { // k는 인덱스값 input은 데이터값
if (k == 0) {
addFirst(input);
} else {
Node temp1 = node(k - 1); // 이전 노드를 temp1으로 지정
Node temp2 = temp1.next; // temp1이 temp2를 가리킴.
Node newNode = new Node(input);
temp1.next = newNode; // temp1을 new노드에 연결
newNode.next = temp2; // new노드를 temp2에 연결
size++;
if (newNode.next == null) {
tail = newNode;
}
}
}
// 레퍼런스를 재대로 보이게 하는 tostring
public String toString() {
if (head == null) { // 리스트에 값이 없다면
return "[]";
}
Node temp = head;
String str = "[";
while (temp.next != null) {
str += temp.data + ", ";
temp = temp.next; // 계속해서 다음노드로 감.
}
str += temp.data;
return str + "]";
}
// 처음 노드를 삭제
public Object removeFirst() {
Node temp = head; // temp는 head를 가리킴
head = head.next; // head의 다음 노드를 가리킴
Object returnData = temp.data; // 삭제할 데이터 값을 임시로 returnData변수에 넣음.
temp = null;
size--;
return returnData;
}
// 인덱스 값으로 삭제
public Object remove(int k) {
if (k == 0) { // 인덱스가 0일경우
return removeFirst();
}
Node temp = node(k - 1); // 삭제할 노드의 전값이 temp가 가리킴
Node todoDeleted = temp.next; // 삭제하려는 노드를 기리킴
temp.next = temp.next.next; // 삭제하려고 하는 노드를 가리켰던 temp가 그 삭제하려고 하는 노드 다음 노드를 가리킴
Object returnData = todoDeleted.data;
if (todoDeleted == tail) { // 삭제하려고 하는 노드가 tail이면
tail = temp; // tail은 삭제하려고 하는 이전노드다.
}
todoDeleted = null; // 삭제.
size--;
return returnData;
}
// 뒤에있는 숫자 삭제
public Object removeLast() {
return remove(size - 1);
}
// 사이즈값 출력
public int size() {
return size;
}
// 특정한 엘리먼트(값) 을 찾아오는 방법
public Object get(int k) {
Node temp = node(k); // 인덱스값을 그대로 temp에 줌
return temp.data;
}
// 몇번째 인덱스에 있는지 판단하는 방법
public int indexOf(Object data) {
Node temp = head;
int index = 0;
while (temp.data != data) {
temp = temp.next;
index++;
if (temp == null) { // 끝에 있는 인덱스에 도달했을때
return -1;
}
}
return index;
}
}
생활코딩님의 linked list 삽입삭제 알고리즘을 영상을 보고 이해하면서 따로 코드와 노드 원리를 그림으로 그렸습니다.
같이 보시고 참고하시면 공부하는데 도움이 될것 같습니다.
'Algoritum' 카테고리의 다른 글
JAVA Queue Stack Hash (2) | 2023.07.25 |
---|---|
JAVA 이진탐색트리 AVL 자료구조 (4) | 2023.07.24 |
JAVA Linked List (29) | 2023.07.19 |
JAVA 시간복잡도와 정렬 출력프로그램 (22) | 2023.07.17 |
Day10 자료구조 정렬의 시간복잡도 (20) | 2023.07.17 |
블로그의 정보
감성 개발자 효기
효기’s