Hyogi's Notebook

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 삽입삭제 알고리즘을 영상을 보고 이해하면서 따로 코드와 노드 원리를 그림으로 그렸습니다.

 

같이 보시고 참고하시면 공부하는데 도움이 될것 같습니다.

 

https://opentutorials.org/module/1335/8857

'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

활동하기