본문 바로가기

[JAVA/자료구조] 


LinkedList 링크드리스트 코드


 및 알아보기



https://visualgo.net/en/list 

그림으로 알아보기




위와 같은 구조가 단순연결리스트 ( LinkedList ) 입니다.


삽입/삭제가 ArrayList보다 빠르다는 장점이 있습니다.


단점으로는 ArrayList는 무작위 접근이 가능하지만 


LinkedList 에서는 순차접근만이 가능합니다.


왜그런지는


코드를 통해서 알아보도록 하겠습니다.



우선적으로 class를 만들어 줍니다.


이름은 LinkedList로 만들겠습니다.


public class LinkedList {

private Node head;  // 맨 앞 정보를 가지고 있는 head 노드

private Node tail;    // 맨 끝 정보를 가지고 있는 tail 노드

private int size = 0;  // 노드의 크기 정보를 가지고 있는 변수

// 노드 선언 그림에서 O 가 되겠네요

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); // 노드 생성

                // 새로운 노드는 head 정보를 가지고 있음

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++;

}

}

          // 노드 추가하기

public void add(int k, Object input) {

if(k == 0) {

addFirst(input);  // 맨 처음일 경우 addFirst 함수 실행

}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;

}

}

}

          // 맨처음 노드 삭제하기

public Object removeFirst() {

Node temp = head; // head 정보를 이용하여 삭제

head = head.next;

Object returnData = temp.data;

temp = null;

size--;

return returnData;

}

    // 노드 삭제하기

public Object remove(int k) {

if(k == 0) {

return removeFirst();

}else {

Node temp = node(k-1);

Node todoDeleted = temp.next;

temp.next = todoDeleted.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;

}

// 데이터로 index 번호 알아오기

public int indexOf(Object inputdata) {

Node temp = head;

int index = 0;

while(temp.data != inputdata) {

temp = temp.next;

index++;

if(temp == null) {

return -1;

}

}

return index;

}

// 이터레이터

public ListIterator listIterator() {

return new ListIterator();

}

public String toString() {

if(head == null) {

return "[]";

}

Node temp = head;

String str = "[";

while(temp.next != null) {

str += temp.data + ", ";

temp = temp.next;

}

str += tail.data;

return str+"]";

}

Node node(int index) {

Node x = head;

for(int i=0; i < index; i++) {

x = x.next;

}

return x;

}

// 노드를 검색, 수정하기 위한 메소드

public class ListIterator{

private Node next;

private Node lastReturned;

private int nextIndex = 0;

ListIterator(){

next = head;

}

// 선택 노드 다음

public Object next() { 

lastReturned = next;

next = next.next;

nextIndex++;

return lastReturned.data;

}

public boolean hasNext() {

return nextIndex < size();

}

public void add(Object input) {

Node newNode = new Node(input);

if(lastReturned == null) {

head = newNode;

newNode.next = next;

}else {

lastReturned.next = newNode;

newNode.next = next;

}

lastReturned = newNode;

nextIndex++;

size++;

}

public void remove() {

if(nextIndex == 0) {

throw new IllegalStateException();

}

LinkedList.this.remove(nextIndex-1);

nextIndex--;

}

}

}



이제는 Main Class에서 LinkedList Class를 선언하여


사용하시면 되겠습니다.


이상으로 LinkedList를 코드로 알아보았습니다.


생활코딩 LinkedList를 참고하였습니다.



[JAVA/자료구조] LinkedList 링크드리스트 코드 및 알아보기


포스팅을 마치겠습니다.

엉망진창

개인 블로그 입니다. 코딩, 맛집, 정부정책, 서비스, ~방법 등 다양한 정보를 소개합니다