☕️ [JAVA] 연결 리스트 구현
자바로 연결리스트 자료구조를 구현해보겠습니다.
- 생성자
public class DoubleLinkedList<T> {
public Node<T> head = null;
public class Node<T>{
T data;
Node<T> next = null;
public Node(T data){
this.data = data;
}
}
}
인스턴스 변수 head를 선언해주고 기본값은 null로 합니다.
Node 클래스와 생성자를 만들어 줍니다.
인자(data)로 받은 값으로 인스턴스 변수(Node클래스의) data의 값을 설정해줍니다.
- 값 추가 메소드
public void addNode(T data){
if (head ==null) {
head = new Node<T>(data);
} else {
Node<T> node = this.head;
while (node.next != null) {
node = node.next;
}
node.next = new Node<T>(data);
}
}
값을 추가하는 메소드를 만들어 줍니다.
addNode메소드를 실행하면
head값이 없으면 addNode메소드에 인자로 받은 data값으로 Node인스턴스를 만들어서 head에 할당합니다.
만약 head값이 있으면
heade값(node변수에 담은)의 next값이 null일 때 까지 반복문으로 돌고
node의 next값에 addNode메소드에 인자로 받은 값으로 Node인스턴스를 만들어서 할당해줍니다.
- 전체 연결리스트 내용물 출력 메소드
public void printAll() {
if (head != null) {
Node<T> node = this.head;
System.out.println(node.data);
while (node.next != null) {
node = node.next;
System.out.println(node.data);
}
}
}
head값이 null이 아니면 변수 node에 head값을 할당해주고 프리트하고
node의 next값이 있으면 프린트하는 부분을 반복을 해주어서 연결리스트의 모든 요소를 출력하게 해줍니다.
- 검색 메소드
public Node<T> search(T data) {
if (this.head == null){
return null;
} else {
Node<T> node = this.head;
while (node != null) {
if (node.data ==data) {
return node;
} else {
node = node.next;
}
}
return null;
}
}
head값이 없으면 null을 리턴 합니다.
있으면 node변수에 head값을 할당, node.data가 search메소드의 인자(data)로 받은값이랑 일치하면 node(head값을 할당한)를 리턴
없으면 node.next의 값을 node에 할당해서 null이 될 때까지 반복문을 돌린다.
끝까지 없으면 null을 반환한다.
- 노드 삭제 메소드
public boolean delNode(T isData) {
if (this.head == null) {
return false;
}
Node<T> node = this.head;
if (node.data ==isData) {
this.head = this.head.next;
return true;
}
while (node.next != null) {
if (node.next.data == isData) {
node.next = node.next.next;
return true;
}
node = node.next;
}
return false;
}
head값이 null이면 false를 리턴
변수 node에 head값을 할당해주고 node.data가 delNode메소드의 인자(isData)로 받은 값과 일치하면
head값을 head.next로 할당해주면서 해당 항목을 지우게 됩니다.
만약 data값이 인자(isData)와 다르면 node.next값이 null이 아닐때 까지 반복문을 돌려서 node.next.data값이 isData와 값이 같으면
node.next에 node.next.next를 할당해주고 true를 리턴합니다.
반복문이 돌때마다 node변수에는 node.next를 할당해줍니다.
끝까지 안나오면 false를 리턴합니다.
- 노드 중간에 삽입하기
public void addNodeInside(T data, T isData) {
Node<T> searchedNode = this.search(isData);
if (searchedNode == null) {
this.addNode(data);
} else {
Node<T> nextNode = searchedNode.next;
searchedNode.next = new Node<T>(data);
searchedNode.next.next = nextNode;
}
}
searchedNode변수에 위에서 만들어준 검색메소드에 검색할 data(isData)를 인자로 넣어서 리턴값을 할당해준다.
searchedNode가 null이면 addNode메소드에 data를 인자로 넣어서 실행한다.
null이 아니면
변수 nextNode에 searchedNode.next를 임시로 저장하고
searchedNode.next에 삽입할 데이터를 넣고
searchedNode.next.next에 아까 미리 담아둔 nextNode를 넣어서 데이터가 중간에 삽입되게 한다.
최종 코드
public class LinkedList<T> {
public Node<T> head = null;
public class Node<T>{
T data;
Node<T> next = null;
public Node(T data){
this.data = data;
}
}
public void addNode(T data){
if (head ==null) {
head = new Node<T>(data);
} else {
Node<T> node = this.head;
while (node.next != null) {
node = node.next;
}
node.next = new Node<T>(data);
}
}
public void printAll() {
if (head != null) {
Node<T> node = this.head;
System.out.println(node.data);
while (node.next != null) {
node = node.next;
System.out.println(node.data);
}
}
}
public Node<T> search(T data) {
if (this.head == null){
return null;
} else {
Node<T> node = this.head;
while (node != null) {
if (node.data ==data) {
return node;
} else {
node = node.next;
}
}
return null;
}
}
public boolean delNode(T isData) {
if (this.head == null) {
return false;
}
Node<T> node = this.head;
if (node.data ==isData) {
this.head = this.head.next;
return true;
}
while (node.next != null) {
if (node.next.data == isData) {
node.next = node.next.next;
return true;
}
node = node.next;
}
return false;
}
public void addNodeInside(T data, T isData) {
Node<T> searchedNode = this.search(isData);
if (searchedNode == null) {
this.addNode(data);
} else {
Node<T> nextNode = searchedNode.next;
searchedNode.next = new Node<T>(data);
searchedNode.next.next = nextNode;
}
}
}