1. 헤드 삭제하는 방법
temp = head
head = head -> next
free(temp)
2.끝 삭제하는 방법
prev는 마지막 두 번째 노드를 가리키고 prev의 next를 null로 만들고 end는 삭제합니다.
Node end = head;
Node prev = null
while(end->next) {
prev = end
end = end->next
}
prev->next = null
free(end)
3. 특정 위치 삭제하는 방법
삭제할 노드 앞의 포인터와 삭제할 노드에 대한 포인터를 찾습니다.
temp = head;
prev = head;
for(int i = 0; i < position; i++) {
if(i == 0 && position == 1) {
head = head->next;
free(temp);
} else {
if(i == position - 1 && temp) {
prev->next = temp->next;
free(temp);
} else {
prev = temp;
if(prev == null) break;
temp = temp->next;
}
}
}
반복문을 사용하여 삭제 구현
public class SinglyLinkedList {
static Node head;
static class Node {
int data;
Node next;
Node(int d) {
this.data = d;
this.next = null;
}
}
static void append(int newData) {
Node newNode = new Node(newData);
if(head == null) {
head = newNode;
return;
}
Node last = head;
while(last.next != null) last = last.next;
last.next = newNode;
return;
}
static void deleteNode(int position) {
if(head == null) {
System.out.println("no head");
return;
}
Node temp = head;
Node prev = head;
if(position == 1) head = head.next;
else {
for(int i = 0; i < position; i++) {
if(temp == null) {
System.out.println("no prev");
return;
} else if(i == position - 1) {
prev.next = temp.next;
return;
}
prev = temp;
temp = temp.next;
}
}
}
public static void main(String[] args) {
append(1);
append(2);
append(3);
deleteNode(2);
printList(head);
}
static void printList(Node n) {
while(n != null) {
System.out.println(n.data);
n = n.next;
}
}
}
재귀를 이용한 노드를 삭제 하는 방법
- 노드 포인터를 함수에 매개변수로 전달합니다.
- 참조로 전달되기 때문에 현재 노드가 변경되면 양 옆에 노드도 변경됩니다.
- 주어진 값을 포함하는 노드를 찾습니다.
- 메모리 해제를 사용하려면 해당 노드를 저장합니다.
- 노드 포인터를 변경하여 이전 노드 포인터의 현재 노드 포인터를 연결하도록 합니다.
public class SinglyLinkedList {
static Node head;
static class Node {
int data;
Node next;
Node(int d) {
this.data = d;
this.next = null;
}
}
static void append(int newData) {
Node newNode = new Node(newData);
if(head == null) {
head = newNode;
return;
}
Node last = head;
while(last.next != null) last = last.next;
last.next = newNode;
return;
}
static int deleteNode(Node head, int val) {
if(head == null) {
System.out.println("no element");
return -1;
}
if(head.data == val) {
if(head.next != null) {
head.data = head.next.data;
head.next = head.next.next;
return 1;
} else
return 0;
}
if(deleteNode(head.next, val) == 0) {
head.next = null;
return 1;
}
return -1;
}
public static void main(String[] args) {
append(1);
append(2);
append(3);
append(4);
deleteNode(head, 2);
printList(head);
}
static void printList(Node n) {
while(n != null) {
System.out.println(n.data);
n = n.next;
}
}
}
삭제할 노드를 찾으면 그 노드를 다음 노드로 대체해서 삭제하는 방식인데 마지막 노드를 삭제하는 경우 그 이전에 노드에 포인터를 null로 만듭니다.
'알고리즘 > 자료구조' 카테고리의 다른 글
이중 연결 리스트에서 데이터 추가하는 4가지 방법 (0) | 2024.04.22 |
---|---|
이중 연결 리스트 특징, 정의 (0) | 2024.04.22 |
단일 연결 리스트(Singly Linked List) 3가지 추가 방법 (0) | 2024.04.19 |
단일 연결 리스트(Singly Linked List) 특징, 장단점, 생성, 탐색 (0) | 2024.04.19 |
Linked List 무엇인가(연결 리스트와 배열의 차이) (0) | 2024.04.19 |