LinkedList 구현법(removeFirst, remove, removeLast)

왱구·2023년 12월 15일

JAVA

목록 보기
14/17

1. List의 첫 값을 삭제하는 removeFirst

package list.linkedlist.implementation;

public class LinkedList {
	private Node head; //누가 첫번째 노드인가
	private Node tail; //누가 끝 노드인가
	private int size = 0; //몇개의 노드가 리스트 안에 포함되어있는가
	//LinkedList에서는 배열을 이용하지 않고 객체와 객체를 연결해서 리스트를 만들거다
	//하나의 노드가 하나의 객체다
	private class Node{
		//Node라는 클래스는 어떤속성을 가져야하는가
		//데이터필드, 링크필드
		private Object data;	//각각의 노드가 저장할 데이터
		private Node next;	//누가 다음 노드인가
		public Node(Object input) {
			//인풋은 노드가 처음 생성되었을때 값이 필요
			//값들이 인풋이라고 하는 생성자의 매개변수로 전달이 된다
			this.data = input;
			this.next = null;
			
		}
		//toString을 구현한 이유 : 만약 우리가 디버깅이나 테스팅용도로
		//노드 객체를 출력해볼때 데이터값이 무엇인가를 출력해주기위해
		public String toString() {
			return String.valueOf(this.data);
		}
	}
	//새로운 메서드 생성
	//Main클래스의 addFirst(30)이 input으로 들어와서 addFirst가 동작하게됨
	public void addFirst(Object input) {
		//addFirst로 들어온 input값을 받아서 Node객체를 생성해야함
		Node newNode = new Node(input);	//data=30, next=null
		newNode.next = head;
		head = newNode;	//방금 생성한 노드가 헤드값 이면서 테일값
		size++;	//노드를 추가했기때문에 추가
		if(head.next == null) {//head의 next가 존재하지 않는다면
			tail = head;	//head와 tail은 같다
		}
		//다음 input값이 들어오면 Node객체가 추가로 생성되고 
		//만들어진 노드의 next값으로 head를 지정하고있다
		//head는 새로 만들어진 Node를 가리켜야한다

			
	}
	public void addLast(Object input) {
		Node newNode = new Node(input);
		if(size == 0) {//데이터가 없는 상태면 tail에 해당되는 데이터는 존재X
			addFirst(input);//때문에 addFirst함수를 통해 인풋하고
		}else {//데이터가 있는 상태일때 addLast사용
			tail.next = newNode;
			tail = newNode;
			size++;
		}
	}
	//Node출력
	Node node(int index) {
		//첫번째노드(인덱스0)은 헤드값 리턴하면 ok
		Node x = head;
		//인덱스를 2 주면 x = x.next;를 두개준다
		//인덱스의 번호와 x = x.next;갯수를 동일하게
//		x = x.next;
//		x = x.next;  //때문에 for문을 사용한다
		for(int i = 0; i<index; i++) {
			x = x.next;
		}
		return x;
		
	}//k값이 인덱스값
	public void add(int k, Object input) {
		if(k==0) {
			addFirst(input);
		}else { 
			//인덱스값 2가 들어오게되면 k-1에서 1이 되고 1의값이
			//node메서드의 인덱스로 호출이 된다
			//for문에서 조건식 i<1이므로 for문은 한번 작동
			//x의값이 인덱스값 1로 반환이되고 그 값을 temp1으로 준다
			Node temp1 = node(k-1);
			Node temp2 = temp1.next;
			
			Node newNode = new Node(input);
			temp1.next = newNode;
			newNode.next = temp2;
			size++;
			//만약 노드의 다음값이 null이면 노드는 tail이다
			if(newNode.next == null) {
				tail = newNode;
			}
		}

	}
	//리스트가 지닌 데이터를 출력
	public String toString() {
		//리스트에 데이터가 없는조건
		if(head == null) {
			return "[]";				
		}
		Node temp = head;
		String str = "[";
		//head가 next가 없다면 while문은 실행되지 않는다
		//head가 next가 다음노드를 지정하고있다면 while실행됨
		while(temp.next != null) {
			//str변수에 현재 temp의값 추가가 되고 구분자 , 찍는다
			//현재 temp의 값을 str에 기록했기 때문에 다음노드로 움직인다
			str += temp.data + ", ";
			temp = temp.next;
			//마지막노드는 next가 false가 되므로 while문이 멈추게된다
		}
		str += temp.data;
		
		return str+"]";
	}//메서드 생성
	public Object removeFirst() {
		//노드를 지우기 전에 헤드를 옆으로 옮긴다
		Node temp = head;
		head = head.next;
		//삭제된 값도 returnData로 옮겨서 출력하겠다
		Object returnData = temp.data;
		temp = null;
		size--;
		return returnData;
		
	}
	
	
	
}	
package list.linkedlist.implementation;

public class Main {

	public static void main(String[] args) {
		//LinkedList 객체생성
		//LinkedList를 만들고 numbers라는 변수에 담고
		//new를 통해 LinkedList라는 클래스를 인스턴스화
		LinkedList numbers = new LinkedList();
		//tail에 노드추가
		numbers.addLast(10);
		numbers.addLast(20);
		numbers.addLast(30);
		//노드삭제
		System.out.println(numbers.removeFirst());
		System.out.println(numbers);
	}

}

2. index값의 데이터를 삭제하는 remove

package list.linkedlist.implementation;

public class LinkedList {
	private Node head; //누가 첫번째 노드인가
	private Node tail; //누가 끝 노드인가
	private int size = 0; //몇개의 노드가 리스트 안에 포함되어있는가
	//LinkedList에서는 배열을 이용하지 않고 객체와 객체를 연결해서 리스트를 만들거다
	//하나의 노드가 하나의 객체다
	private class Node{
		//Node라는 클래스는 어떤속성을 가져야하는가
		//데이터필드, 링크필드
		private Object data;	//각각의 노드가 저장할 데이터
		private Node next;	//누가 다음 노드인가
		public Node(Object input) {
			//인풋은 노드가 처음 생성되었을때 값이 필요
			//값들이 인풋이라고 하는 생성자의 매개변수로 전달이 된다
			this.data = input;
			this.next = null;
			
		}
		//toString을 구현한 이유 : 만약 우리가 디버깅이나 테스팅용도로
		//노드 객체를 출력해볼때 데이터값이 무엇인가를 출력해주기위해
		public String toString() {
			return String.valueOf(this.data);
		}
	}
	//새로운 메서드 생성
	//Main클래스의 addFirst(30)이 input으로 들어와서 addFirst가 동작하게됨
	public void addFirst(Object input) {
		//addFirst로 들어온 input값을 받아서 Node객체를 생성해야함
		Node newNode = new Node(input);	//data=30, next=null
		newNode.next = head;
		head = newNode;	//방금 생성한 노드가 헤드값 이면서 테일값
		size++;	//노드를 추가했기때문에 추가
		if(head.next == null) {//head의 next가 존재하지 않는다면
			tail = head;	//head와 tail은 같다
		}
		//다음 input값이 들어오면 Node객체가 추가로 생성되고 
		//만들어진 노드의 next값으로 head를 지정하고있다
		//head는 새로 만들어진 Node를 가리켜야한다

			
	}
	public void addLast(Object input) {
		Node newNode = new Node(input);
		if(size == 0) {//데이터가 없는 상태면 tail에 해당되는 데이터는 존재X
			addFirst(input);//때문에 addFirst함수를 통해 인풋하고
		}else {//데이터가 있는 상태일때 addLast사용
			tail.next = newNode;
			tail = newNode;
			size++;
		}
	}
	//Node출력
	Node node(int index) {
		//첫번째노드(인덱스0)은 헤드값 리턴하면 ok
		Node x = head;
		//인덱스를 2 주면 x = x.next;를 두개준다
		//인덱스의 번호와 x = x.next;갯수를 동일하게
//		x = x.next;
//		x = x.next;  //때문에 for문을 사용한다
		for(int i = 0; i<index; i++) {
			x = x.next;
		}
		return x;
		
	}//k값이 인덱스값
	//add하기 위해서는 이전노드를 알아야한다
	public void add(int k, Object input) {
		if(k==0) {
			addFirst(input);
		}else { 
			//인덱스값 2가 들어오게되면 k-1에서 1이 되고 1의값이
			//node메서드의 인덱스로 호출이 된다
			//for문에서 조건식 i<1이므로 for문은 한번 작동
			//x의값이 인덱스값 1로 반환이되고 그 값을 temp1으로 준다
			Node temp1 = node(k-1);
			Node temp2 = temp1.next;
			
			Node newNode = new Node(input);
			temp1.next = newNode;
			newNode.next = temp2;
			size++;
			//만약 노드의 다음값이 null이면 노드는 tail이다
			if(newNode.next == null) {
				tail = newNode;
			}
		}

	}
	//리스트가 지닌 데이터를 출력
	public String toString() {
		//리스트에 데이터가 없는조건
		if(head == null) {
			return "[]";				
		}
		Node temp = head;
		String str = "[";
		//head가 next가 없다면 while문은 실행되지 않는다
		//head가 next가 다음노드를 지정하고있다면 while실행됨
		while(temp.next != null) {
			//str변수에 현재 temp의값 추가가 되고 구분자 , 찍는다
			//현재 temp의 값을 str에 기록했기 때문에 다음노드로 움직인다
			str += temp.data + ", ";
			temp = temp.next;
			//마지막노드는 next가 false가 되므로 while문이 멈추게된다
		}
		str += temp.data;
		
		return str+"]";
	}//메서드 생성
	public Object removeFirst() {
		//노드를 지우기 전에 헤드를 옆으로 옮긴다
		Node temp = head;
		head = head.next;
		//삭제된 값도 returnData로 옮겨서 출력하겠다
		Object returnData = temp.data;
		temp = null;
		size--;
		return returnData;
		
	}
	
	public Object remove(int k) {
		//인덱스값이 0이면 removeFirst메서드를 불러온다
		if(k == 0) {
			return removeFirst();
		}
		//temp가 가리키는 노드의 다음노드를 삭제할거다
		//
		Node temp = node(k-1);
		Node todoDeleted = temp.next;
		//삭제된 값도 returnData로 옮겨서 출력하겠다
		temp.next = temp.next.next;
		Object returnData = todoDeleted.data;
		//삭제하려는 노드가 마지막값(tail)이라면 
		if(todoDeleted == tail) {
			tail = temp; //삭제하려는 노드의 이전 노드이다
		}
		todoDeleted = null;
		size--;
		//옮겨놨던 리턴데이터 리턴
		return returnData;
	}
	
}	
package list.linkedlist.implementation;

public class Main {

	public static void main(String[] args) {
		//LinkedList 객체생성
		//LinkedList를 만들고 numbers라는 변수에 담고
		//new를 통해 LinkedList라는 클래스를 인스턴스화
		LinkedList numbers = new LinkedList();
		//tail에 노드추가
		numbers.addLast(10);
		numbers.addLast(20);
		numbers.addLast(30);
		//몇번째 인덱스에 있는 값을 삭제할것인지
		System.out.println(numbers.remove(2));
		System.out.println(numbers);
	}

}

3 tail값을 삭제하는 removeLast

package list.linkedlist.implementation;

public class LinkedList {
	private Node head; //누가 첫번째 노드인가
	private Node tail; //누가 끝 노드인가
	private int size = 0; //몇개의 노드가 리스트 안에 포함되어있는가
	//LinkedList에서는 배열을 이용하지 않고 객체와 객체를 연결해서 리스트를 만들거다
	//하나의 노드가 하나의 객체다
	private class Node{
		//Node라는 클래스는 어떤속성을 가져야하는가
		//데이터필드, 링크필드
		private Object data;	//각각의 노드가 저장할 데이터
		private Node next;	//누가 다음 노드인가
		public Node(Object input) {
			//인풋은 노드가 처음 생성되었을때 값이 필요
			//값들이 인풋이라고 하는 생성자의 매개변수로 전달이 된다
			this.data = input;
			this.next = null;
			
		}
		//toString을 구현한 이유 : 만약 우리가 디버깅이나 테스팅용도로
		//노드 객체를 출력해볼때 데이터값이 무엇인가를 출력해주기위해
		public String toString() {
			return String.valueOf(this.data);
		}
	}
	//새로운 메서드 생성
	//Main클래스의 addFirst(30)이 input으로 들어와서 addFirst가 동작하게됨
	public void addFirst(Object input) {
		//addFirst로 들어온 input값을 받아서 Node객체를 생성해야함
		Node newNode = new Node(input);	//data=30, next=null
		newNode.next = head;
		head = newNode;	//방금 생성한 노드가 헤드값 이면서 테일값
		size++;	//노드를 추가했기때문에 추가
		if(head.next == null) {//head의 next가 존재하지 않는다면
			tail = head;	//head와 tail은 같다
		}
		//다음 input값이 들어오면 Node객체가 추가로 생성되고 
		//만들어진 노드의 next값으로 head를 지정하고있다
		//head는 새로 만들어진 Node를 가리켜야한다

			
	}
	public void addLast(Object input) {
		Node newNode = new Node(input);
		if(size == 0) {//데이터가 없는 상태면 tail에 해당되는 데이터는 존재X
			addFirst(input);//때문에 addFirst함수를 통해 인풋하고
		}else {//데이터가 있는 상태일때 addLast사용
			tail.next = newNode;
			tail = newNode;
			size++;
		}
	}
	//Node출력
	Node node(int index) {
		//첫번째노드(인덱스0)은 헤드값 리턴하면 ok
		Node x = head;
		//인덱스를 2 주면 x = x.next;를 두개준다
		//인덱스의 번호와 x = x.next;갯수를 동일하게
//		x = x.next;
//		x = x.next;  //때문에 for문을 사용한다
		for(int i = 0; i<index; i++) {
			x = x.next;
		}
		return x;
		
	}//k값이 인덱스값
	//add하기 위해서는 이전노드를 알아야한다
	public void add(int k, Object input) {
		if(k==0) {
			addFirst(input);
		}else { 
			//인덱스값 2가 들어오게되면 k-1에서 1이 되고 1의값이
			//node메서드의 인덱스로 호출이 된다
			//for문에서 조건식 i<1이므로 for문은 한번 작동
			//x의값이 인덱스값 1로 반환이되고 그 값을 temp1으로 준다
			Node temp1 = node(k-1);
			Node temp2 = temp1.next;
			
			Node newNode = new Node(input);
			temp1.next = newNode;
			newNode.next = temp2;
			size++;
			//만약 노드의 다음값이 null이면 노드는 tail이다
			if(newNode.next == null) {
				tail = newNode;
			}
		}

	}
	//리스트가 지닌 데이터를 출력
	public String toString() {
		//리스트에 데이터가 없는조건
		if(head == null) {
			return "[]";				
		}
		Node temp = head;
		String str = "[";
		//head가 next가 없다면 while문은 실행되지 않는다
		//head가 next가 다음노드를 지정하고있다면 while실행됨
		while(temp.next != null) {
			//str변수에 현재 temp의값 추가가 되고 구분자 , 찍는다
			//현재 temp의 값을 str에 기록했기 때문에 다음노드로 움직인다
			str += temp.data + ", ";
			temp = temp.next;
			//마지막노드는 next가 false가 되므로 while문이 멈추게된다
		}
		str += temp.data;
		
		return str+"]";
	}//메서드 생성
	public Object removeFirst() {
		//노드를 지우기 전에 헤드를 옆으로 옮긴다
		Node temp = head;
		head = head.next;
		//삭제된 값도 returnData로 옮겨서 출력하겠다
		Object returnData = temp.data;
		temp = null;
		size--;
		return returnData;
		
	}
	
	public Object remove(int k) {
		//인덱스값이 0이면 removeFirst메서드를 불러온다
		if(k == 0) {
			return removeFirst();
		}
		//temp가 가리키는 노드의 다음노드를 삭제할거다
		//
		Node temp = node(k-1);
		Node todoDeleted = temp.next;
		//삭제된 값도 returnData로 옮겨서 출력하겠다
		temp.next = temp.next.next;
		Object returnData = todoDeleted.data;
		//삭제하려는 노드가 마지막값(tail)이라면 
		if(todoDeleted == tail) {
			tail = temp; //삭제하려는 노드의 이전 노드이다
		}
		todoDeleted = null;
		size--;
		//옮겨놨던 리턴데이터 리턴
		return returnData;
	}
	public Object removeLast() {
		//사이즈는 몇개의 노드가 있는가
		//마지막노드는 사이즈에서 1을 뺀 값이 인덱스값이된다
		return remove(size-1);
		
	}
	
}	
package list.linkedlist.implementation;

public class Main {

	public static void main(String[] args) {
		//LinkedList 객체생성
		//LinkedList를 만들고 numbers라는 변수에 담고
		//new를 통해 LinkedList라는 클래스를 인스턴스화
		LinkedList numbers = new LinkedList();
		//tail에 노드추가
		numbers.addLast(10);
		numbers.addLast(20);
		numbers.addLast(30);
		//tail값 삭제
	System.out.println(numbers.removeLast());
		System.out.println(numbers);
	}

}
profile
늦깎이 애아빠 개발지망생

0개의 댓글