単一接続リスト
ポインタを使用した接続リストの作成
import java.util.Comparator; //연결 리스트 클래스
public class LinkedList<E> { // 노드
class Node<E>{
private E data; //데이터
private Node<E> next; //뒤쪽 포인터(다음 노드 참조)
//생성자
Node(E data, Node<E> next){
this.data = data;
this.next = next;
}
}
private Node<E> head; //머리 노드
private Node<E> crnt; //선택 노드; 검색, 삭제 용도
private int size; //요소 개수(=연결된 노드의 개수)
}
作成者:Nodeの作成者はそのフィールドに引数として渡されるデータを設定し、nextナビゲーションリスト
//탐색하기
private Node<E> search(int index){
if(index<0 || index>=size) { //인덱스 범위 밖인 경우 오류
throw new IndexOutOfBoundsException();
}
Node<E> x = head;
for(int i=0; i<index; i++) {
x = x.next;
}
return x;
}
リストの挿入
//머리에 노드 삽입
public void addFirst(E obj) {
Node<E> ptr = head; //머리 노드에 대한 포인터 -> ptr
head = crnt = new Node<E>(obj, ptr);
//삽입할 노드 생성, 뒤쪽 포인터 ptr, 생성한 노드를 참조하도록 head 업데이
}
//꼬리에 노드 삽입
public void addLast(E obj) {
if(head==null) //리스트가 비어 있으면
addFirst(obj); //머리에 삽입
else {
Node<E> ptr = head;
while(ptr.next != null) //꼬리 노드 찾기 -> 처음부터 차례로 스캔
ptr = ptr.next;
ptr.next = crnt = new Node<E>(obj, null);
}
}
//중간에 노드 삽입
public void add(int index, E obj) {
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
}
//0번째 인덱스(맨앞)에 추가
if(index == 0) {
addFirst(obj);
return;
}
//마지막 인덱스 추가
if(index == size-1) {
addLast(obj);
return;
}
Node<E> newNode = new Node<E>(obj, null);
Node<E> prevNode = search(index-1);
Node<E> nextNode = prevNode.next;
/*연결된 노드와 노드 사이를 끊기
-> 선행 노드의 끝은 null로, 추가한 노드의 끝은 후행 노드의 링크를 넣어준다.*/
prevNode.next = null;
prevNode.next = newNode;
newNode.next = nextNode;
size++;
}
リストの削除
//머리 노드 삭제
public void removeFirst() {
if (head != null) //리스트가 비어 있지 않으면
head = crnt = head.next;
}
//꼬리 노드 삭제
public void removeLast() {
if(head != null) {
if(head.next == null) //노드가 하나만 있으면 머리 노드 삭제
removeFirst();
else {
Node<E> ptr = head; //스캔 중인 노드
Node<E> pre = head; // 스캔 중인 노드의 앞쪽 노드
while(ptr.next != null) { //ptr -> 꼬리 노드, pre -> 꼬리로부터 두 번째 노드
pre = ptr;
ptr = ptr.next;
}
pre.next = null;
crnt = pre;
}
}
}
//중간 노드 삭제
public void remove(Node p) {
if(head != null) {
if(p==head) //p가 머리 노드면 머리 노드 삭제
removeFirst();
else {
Node<E> ptr = head;
while(ptr.next != p) {
ptr = ptr.next;
if(ptr == null) return ;
}
ptr.next = p.next;
crnt = ptr;
}
}
}
//선택 노드 삭제
public void removeCurrentNode() {
remove(crnt);
}
//모든 모드 삭제
public void clear() {
while(head != null)
removeFirst();
crnt = null;
}
追加
//선택 노드를 하나 뒤쪽으로 이동
public boolean next() {
if(crnt == null || crnt.next == null) //이동 불가
return false;
crnt = crnt.next;
return true;
}
//선택 노드 출력
public void printCurrentNode() {
if(crnt == null)
System.out.println("선택한 노드가 없습니다.");
else
System.out.println(crnt.data);
}
//모든 노드를 출력
public void dump() {
Node<E> ptr = head;
while(ptr != null) {
System.out.println(ptr.data);
ptr = ptr.next;
}
}
Reference
この問題について(単一接続リスト), 我々は、より多くの情報をここで見つけました https://velog.io/@champs/리스트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol