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

+ Recent posts