자료구조 (JAVA)

[생활코딩] LinkedList 코드 분석!! 사용방법 (add, remove, get, size, toString, indexOf...

개발자 배찌 2021. 6. 27. 15:31
728x90

LinkedList 사용방법을 알아보기 위해 어떤식으로 로직이 짜여있는지 

자료구조를 분석해 보았습니다.   

 

(생활코딩 자료구조 영상 참고하였음. LinkedList 의 Iterator 부분은 다음에 공부 할 예정.... 넘어려워요...)

 

 

LinkedList.java

package test;

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) {
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++) {
x = x.next;
}
return x;
}

// 특정한 인덱스에 데이터 추가
public void add(int k, Object input) {
if (k == 0) {
addFirst(input);
} else {
Node temp1 = node(k - 1);
Node temp2 = temp1.next;
Node newNode = new Node(input);
temp1.next = newNode;
newNode.next = 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;
}
return str + "]";
}

//첫번째에 있는 값을 삭제해주는 로직
//리턴값 : 삭제된 값
public Object removeFirst() {
Node temp = head;
head = head.next;
Object returnData = temp.data;
temp = null;
size--;
return returnData;
}

//특정 인덱스의 값을 삭제하고 싶을 때
//리턴값 : 삭제된 값
public Object remove(int k) {
if(k == 0) {
return removeFirst();
}
Node temp = node(k-1);
Node todoDeleted = temp.next;
temp.next = temp.next.next;
Object returnData = todoDeleted.data;
if(todoDeleted == tail) {
tail = temp;
}
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);
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;
}
}

 

Main.java

package test;

public class Main {
  public static void main(String[] args) {
  LinkedList numbers = new LinkedList();
  
  //실습 : 첫번째에 추가
  numbers.addFirst(30);
  numbers.addFirst(20);
  numbers.addFirst(10);
  
  //실습 : 마지막에 추가
  numbers.addLast(40);
  numbers.addLast(50);
  
  //실습 : 특정한위치에 데이터 추가
  numbers.add(1,15);
  
  //실습 : 데이터를 보기 쉽게 하기 위해 toString 구현
  System.out.println(numbers);
  
  //실습 : 첫번째에 있는 값을 삭제해주는 로직
  //리턴값 : 삭제된 값
  numbers.removeFirst();
  System.out.println(numbers);
  
  
  //실습 : 특정 인덱스의 값을 삭제하고 싶을 때
  numbers.remove(2);
  System.out.println(numbers);
  
  //실습 : 마지막에 있는 데이터 값을 삭제하고 싶을 때
  numbers.removeLast();
  System.out.println(numbers);
  
  //실습 :사이즈를 가지고 오고 싶을 때
  System.out.println(numbers.size());
  
  //실습 : 특정 인덱스의 값을 가지고 오고 싶을 때
  System.out.println(numbers.get(2));
  
  //실습 : 데이터값으로 인덱스 정보를 얻어오고 싶을 때
  System.out.println(numbers.indexOf(30));

  }
}