Link Search Menu Expand Document

Linked List

연결리스트 음

Singly Linked List

단순연결리스트
각 노드에 데이터와 포인터를 가지고 있다. 포인터에는 다음 노드의 주소가 저장되어 있다.
각 노드의 순서를 통해

코드는 총 3개의 클래스로 이루어져있다.
Node.java : 노드의 정보를 담는 클래스. 데이터와 포인터를 가지고 있음.
SList.java : 연결리스트의 기능을 구현한 클래스. 리스트 내 데이터 삽입, 삭제, 검색 등의 기능을 가지고 있다.
Main.java : 실행 클래스.

Node.java

public class Node<E> {
	private E item;
	private Node<E> next;

	public Node(E newItem, Node<E> node) {
		// TODO Auto-generated constructor stub
		item = newItem;
		next = node;
	}

	public E getItem() {
		return item;
	}

	public void setItem(E item) {
		this.item = item;
	}

	public Node<E> getNext() {
		return next;
	}

	public void setNext(Node<E> next) {
		this.next = next;
	}
}

SList.java

import java.util.NoSuchElementException; //inderflow 방지

public class SList<E> {

	protected Node head;
	private int size;

	public SList() {
		// TODO Auto-generated constructor stub
		head = null;
		size = 0;
	}

	public int search(E target) {
		Node p = head;
		for (int i = 0; i < size; i++) {
			if (target == p.getItem()) {
				return i;
			}
			p = p.getNext();
		}
		return -1; //탐색 실패
	}

	public void insertFront(E newItem) {
		head = new Node(newItem, head);
		size++;
	}

	public void insertAfter(E newItem, Node p) {
		p.setNext(new Node(newItem, p.getNext()));
		size++;
	}

	public void deleteFront(E newItem) {
		head = new Node(newItem, head);
		size++;
	}

	public void deleteAfter(Node p) {
		if(p ==null) throw new NoSuchElementException();
		Node t = p.getNext();
		p.setNext(t.getNext());
		t.setNext(null);
		size--;
	}

	public void print() {
		Node p = head;
		for (int i = 0; i < size; i++) {
			System.out.print(p.getItem()+"\t");
			p = p.getNext();
		}
	}

	public int size() {
		return size;
	}
}

Main.java

public class Main{
	public static void main(String[] args) {
		SList<String> s = new SList<String>();
		s.insertFront("orange");
		s.insertFront("apple");
		s.insertAfter("cherry", s.head.getNext());
		s.insertFront("pear");

		s.print();
		System.out.println(": s의 길이 = " + s.size()+"\n");
		System.out.println("체리가 \t"+s.search("cherry")+"번째에 있다.");
		System.out.println("키위가 \t"+s.search("kiwi")+"번째에 있다.\n");
		s.deleteAfter(s.head);
		s.print();
		System.out.println(": s의 길이 = " + s.size()+"\n"); //size 구현

		SList<Integer> t = new SList<Integer>();
		t.insertFront(500);
		t.insertFront(200);
		t.insertAfter(400, t.head);
		t.insertFront(100);
		t.insertAfter(300, t.head.getNext());
		t.print();
		System.out.println(": t의 길이 = " + t.size());
	}
}

Double Linked List

이중연결리스트
음 네 컴터로 쓸게욘

Circular Linked List

원형연결리스트
순환 구조의 연결리스트. head가 따로 없고, 마지막 노드를 last라 부른다.
last의 포인터는 첫 노드를 가리킨다.

코드는 총 3개의 클래스로 이루어져있다.
Node.java : 노드의 정보를 담는 클래스. 데이터와 포인터를 가지고 있음. (단순연결리스트의 Node와 동일)
CList.java : 기능을 구현한 클래스. 리스트 내 데이터 삽입, 삭제 등의 기능을 가지고 있다.
Main.java : 실행 클래스.

CList.java

import java.util.NoSuchElementException; //underflow 방지

public class CList<E> {
	protected Node last; //last의 next는 첫 노드
	private int size;

	public CList() {
		last = null;
		size = 0;
	}

	public void insert(E newItem) {
		Node newNode = new Node<E>(newItem, null);
		if (last==null) {
			newNode.setNext(newNode);
			last = newNode;
		} else {
			newNode.setNext(last.getNext());
			last.setNext(newNode);
		}
		size++;
	}

	public Node delete() {
		if (isEmpty()) throw new NoSuchElementException();
		Node x = last.getNext();
		if(x==last) last=null;
		else{
			last.setNext(x.getNext());
			x.setNext(null);
		}
		size--;
		return x;
	}

	public void print() {
		if(size>0){//size 0이면
			//		Node p = last.getNext();
			//		for (int i = 0; i < size; i++) {
			//			System.out.print(p.getItem()+"\t");
			//			p = p.getNext();
			//		}

			int i = 0;
			for(Node p = last.getNext(); i<size; p=p.getNext(), i++){
				//for 안에서 매번하는 짓이라면 변경부에서 변경하면 된다.
				// ; 전에 여러 개를 넣으면 여러 개도 가능. 초기값 정의하는 부분은 자료형이 다르면 한 번에 안 됨
				System.out.print(p.getItem()+"\t");
			}
		}
		else{
			System.out.println("리스트가 없습니다.");
		}
	}

	public int size() {
		return size;
	}

	public boolean isEmpty() {return size==0;}
}

Main.java

public class Main{
	public static void main(String[] args) {
		CList<String> s = new CList<String>();
		s.insert("pear");
		s.insert("cherry");
		s.insert("orange");
		s.insert("apple");
		s.print();
		System.out.println(": s의 길이 = " + s.size()+"\n");
		
		s.delete();
		s.print();
		System.out.println(": s의 길이 = " + s.size()+"\n"); //size 구현
	}
}