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++;
}
}
//지금껏 size값을 갱신해 왔기 때문에 그대로 반환가능
public int size() {
return size;
}
}
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);
//numbers가 지닌 노드의 갯수출력 = size변수 출력
System.out.println(numbers.size());
}
}
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++;
}
}
public Object get(int k) {
//노드라는 메서드에 인덱스값을 그대로 준다
Node temp = node(k);
return temp.data;
}
}
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.get(0));
}
}
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++;
}
}
public int indexOf(Object data) {
Node temp = head;
int index = 0;
//모든 노드를 순회할때 while문을 이용
//현재 노드의 데이터가 우리가 찾는 데이터가 맞는지 비교
while(temp.data != data) {
temp = temp.next;
index++;
if(temp == null) { //가장 끝 노드에 도달한다면
return-1;
}
}
return index;
}
}
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.indexOf(30));
}
}