package edu.exam06.linkedlist;
public class LinkedList {
private Node head; // 머리 노드
private Node crnt; // 현재 위치 노드
public LinkedList() {
// 아무 데이터도 없으므로 null
head = new Node();
crnt = head;
}
// 머리에 노드 삽입
public void addHead(Node node) {
// 2) -> 1)
node.next = head.next;
head.next = node;
crnt = node;
// 1) -> 2)
// Node temp = head.next;
// head.next = node;
// node.next = temp;
}
// 꼬리에 노드 삽입
public void addTail(Node node) {
Node ptr = head;
while(ptr.next!=null)
ptr = ptr.next;
ptr.next = node;
node.next = null;
crnt = node;
}
public void moveFirst() {
crnt = head;
}
// 1) 현재 노드에 삽입
public void insert(Node node) {
Node ptr = head;
Node temp = crnt;
while(ptr.next!=crnt)
ptr =ptr.next;
ptr.next=node; // 현재노드 자리에는 새로운 입력받은 노드가
node.next=temp; // 새로운 노드 다음에는 현재노드가 오고
crnt=node; // 다시 현재노드는 새로운 입력받은 노드가 된다.
}
// 머리쪽 노드 삭제
public void removeHead() {
// 데이터 노드가 없을 때를 처리
if(head.next == null) {
crnt = head;
return;
}
// 데이터 노드가 1개만 있을 때
if(head.next.next == null) {
head.next = null;
crnt = head;
}else{ // 데이터 노드가 여러 개 일때
head.next = head.next.next;
crnt = head.next;
}
}
// 꼬리쪽 노드 삭제
public void removeTail() {
Node ptr = head;
Node pre = null;
while(ptr.next!=null) {
pre = ptr; // 삭제할 대상 노드의 이전 노드
ptr = ptr.next;
}
// 노드가 없을 때는 head의 이전이 없으므로 pre가 null
if(pre!=null) {
pre.next = null;
crnt = pre;
}
}
// 2) 학번이 동일한 노드를 검색
public Node search(int stNum) {
Node ptr = head;
Node pre = null;
while(ptr.next!=null) {
pre = ptr;
ptr = ptr.next;
if(ptr.stNum == stNum) {
crnt = ptr;
return ptr;
}
}
return ptr;
}
// 3) 이름이 동일한 노드를 검색
public Node search(String stName) {
Node ptr = head;
Node pre = null;
while(ptr.next!=null) {
pre = ptr;
ptr = ptr.next;
if(ptr.stName.equals(stName)) {
crnt = ptr;
return ptr;
}
}
return ptr;
}
// 노드내의 학번과 이름이 동일한 노드를 검색
public Node search(Node node) {
Node ptr = head;
Node pre = null;
while(ptr.next!=null) {
pre = ptr;
ptr = ptr.next;
if(ptr.stNum == node.stNum && ptr.stName.equals(node.stName)) {
crnt = ptr;
return ptr;
}
}
return ptr;
}
// 노드 p를 삭제
public void remove(Node p) {
Node ptr = head;
Node pre = null;
while(ptr.next!=null) {
if(ptr == p) {
pre.next = crnt.next;
crnt = crnt.next;
}
pre = ptr;
ptr = ptr.next;
}
}
// 현재 노드를 삭제
public void removeCurrentNode() {
Node ptr = head;
Node pre = null;
while(ptr.next!=null) {
if(ptr == crnt) {
pre.next = crnt.next;
crnt = crnt.next;
}
pre = ptr;
ptr = ptr.next;
}
}
// 모든 노드를 삭제
public void clear() {
head.next = null;
crnt = head;
}
// 선택 노드를 하나 뒤쪽으로 이동
public boolean next() {
boolean isEnable = true;
if(crnt==null || crnt.next == null)
return false; // 이동 불가
crnt = crnt.next;
return isEnable;
}
// 현재 노드를 출력
public void printCurrentNode() {
if(crnt == null)
System.out.println("선택 노드 없습니다");
else
crnt.infoNode();
}
// 전체 노드 출력
public void dump() {
Node ptr = head.next;
System.out.println("#####################");
while(ptr!=null) {
ptr.infoNode();
ptr = ptr.next;
}
}
}
package edu.exam06.linkedlist;
public class Node {
// 데이터 영역
int stNum;
String stName;
// 다음 객체위치를 가리키는 참조변수
Node next;
public Node() {
this.stNum = 0;
this.stName = null;
this.next = null;
}
public Node(int stNum, String stName) {
this.stNum = stNum;
this.stName = stName;
this.next = null;
}
public void infoNode() {
System.out.println("------------------------");
System.out.println("학번: " + stNum);
System.out.println("이름: " + stName);
}
}
package edu.exam06.linkedlist;
public class ListMain {
public static void main(String[] args) {
LinkedList list = new LinkedList();
// 데이터 꼬리에 삽입
/*
list.addTail(new Node(1111, "홍길동"));
list.dump(); // 전체 출력
list.addTail(new Node(2222, "임꺽정"));
list.dump(); // 전체 출력
list.addTail(new Node(3333, "장길산"));
list.dump(); // 전체 출력
list.removeHead();
list.dump();
list.removeTail();
list.dump();
*/
list.addTail(new Node(1111, "홍길동"));
list.addTail(new Node(2222, "임꺽정"));
list.addTail(new Node(3333, "장길산"));
list.addTail(new Node(4444, "허균"));
list.addTail(new Node(5555, "광해군"));
list.addTail(new Node(6666, "일지매"));
Node node = new Node(1111, "홍길동");
Node ptr = list.search(node);
list.printCurrentNode();
list.next();
list.printCurrentNode();
list.next();
list.printCurrentNode();
list.next();
System.out.println("---학번 동일 노드 검색---");
list.search(1111).infoNode();
System.out.println("---이름 동일 노드 검색---");
list.search("허균").infoNode();
list.insert(new Node(7777,"뉴비"));
list.dump();
//list.printCurrentNode();
}
}
'JAVA > java 예제' 카테고리의 다른 글
TreeSet 정렬 예제 (0) | 2020.01.29 |
---|---|
얕은복사 깊은복사 예제 (0) | 2020.01.28 |
링크드리스트로 구현한 주소록 프로그램 (0) | 2020.01.20 |
선형 배열 리스트 예제 (0) | 2020.01.16 |
사용자 정보 CRUD 예제 (0) | 2020.01.15 |