Linked List
선형적인 데이터 구조
- 노드 1 -> 노드 2 -> 노드 3 -> ...
각 노드 = 자신의 데이터 + 내 앞 노드의 주소
Linked List를 사용하는 이유 (장점 )
- 배열의 제한 사항 때문.
- 배열의 크기가 고정
- 새로운 요소를 삽입하는 데 비용이 많이 듬 ( 공간을 만들고, 기존 요소를 전부 이동해야 함)
- 삽입과 삭제가 용이
- 동적 메모리 할당이 가능
- 크기가 가변적
Linked List의 단점
- 임의의 위치로 액세스 불가 ( 첫 번째 노드부터 순차적으로 접근해야함 ➡️ 이진 검색이 불가능 )
- 각 노드마다 내 앞의 노드를 가르키는 데이터를 저장할 공간이 필요
코드
파이썬
#파이썬
class Node:
def __init__(self, new_data) -> None:
self.data = new_data
self.next = None
class LinkedList:
def __init__(self) -> None:
self.head = None
def append(self, data) -> None:
new_node = Node(data)
if self.head:
cur_node = self.head
while cur_node.next != None:
cur_node = cur_node.next
cur_node.next = new_node
else:
self.head = new_node
def appendLeft(self, data) -> None:
new_node = Node(data)
new_node.next = self.head
self.head = new_node
def insert(self, n, data) -> None:
new_node = Node(data)
cur_node = self.head
prev_node = None
while n:
prev_node = cur_node
cur_node = cur_node.next
n -= 1
prev_node.next = new_node
new_node.next = cur_node
def __str__(self) -> str:
cur_node = self.head
res = ""
while cur_node.next != None:
res += cur_node.data + " ➡️ "
cur_node = cur_node.next
res += cur_node.data
return res
lk = LinkedList()
lk.append("node1")
lk.append("node2")
lk.appendLeft("head")
lk.insert(2, "insert 2")
print(lk)
--출력--
head ➡️ node1 ➡️ insert 2 ➡️ node2
자바
//java
public class 자바연습장{
public static void main(String[] args) {
LinkedList lk = new LinkedList();
lk.append(1);
lk.append(2);
lk.append(3);
lk.insert(2, 222);
lk.appendLeft(0);
System.out.println(lk);
}
}
class Node{
public int data;
public Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
class LinkedList {
private Node head;
public LinkedList(){
this.head = null;
}
public void append(int data) {
Node newNode = new Node(data);
if(this.head == null){
this.head = newNode;
} else {
Node curNode = this.head;
while(curNode.next != null) {
curNode = curNode.next;
}
curNode.next = newNode;
}
}
public void appendLeft(int data){
Node newNode = new Node(data);
newNode.next = this.head;
this.head = newNode;
}
public void insert(int n, int data){
Node newNode = new Node(data);
Node prevNode = null;
Node curNode = this.head;
while(n > 1){
prevNode = curNode;
curNode = curNode.next;
n -= 1;
}
prevNode.next = newNode;
newNode.next = curNode;
}
public String toString(){
String res = "";
Node curNode = this.head;
while (curNode.next != null){
res += curNode.data + " -> ";
curNode = curNode.next;
}
res += curNode.data;
return res;
}
}
-- 출력 --
0 -> 1 -> 222 -> 2 -> 3
참고 출처
https://gyoogle.dev/blog/computer-science/data-structure/Linked%20List.html
'CS' 카테고리의 다른 글
[JAVA] Primitive(원시형) Type ↔️ Reference(참조형) Type (0) | 2023.03.14 |
---|---|
[JAVA] Call by Value ? Call by Reference ? (0) | 2023.03.14 |
[컴퓨터구조] ARM(Advanced RISC Machine) 프로세서 정리 (0) | 2023.03.11 |
[컴퓨터구조] 고정 소수점과 부동 소수점 정리 (0) | 2023.03.09 |
[JAVA] 제네릭 - Generic (0) | 2023.03.07 |