자바기초문법

리스트 노드

까마귀코딩 2022. 12. 29. 18:55

노드는 prev  value   next 로 구성되어있다.


 

 

1. 첫 노드를 등록한다.

if (tail == null) {

head = tail = node; 

return;

}

 

 

 

 

2. 노드 끝에 새 노드를 연결한다. 

tail.next = node;             == tail이 가르키는 노드의 next 라는 변수에 새로운 노드를 저장했다.

node.prev = tail;            == 새 노드가 현재노드의 끝노드를 가리키게 한다. 

 

 

 

 

이제 끝 노드를 이동해야겠지?

 

tail = node;                     == 새 노드를 끝 노드로 만든다. 

 

 

 

 

head는 전체 노드리스트에서 맨 첫 노드의 주소를 가리킨다. 

tail 은 전체 노드리스트에서 맨 마지막 노드의 주소를 가리킨다. 

 

 

 

 

 


새 노드 만들기  : add () {}

 

public void add(Object value) {


1. 링크드 리스트 객체 생성하기 

LinkedList  list = new LinkedList();

 

 

2. 새 노드 만들기 

list.add() 를 호출 하면서 새 값을 주면 새 값을 담을 노드를 만든다.

 

 

3. 그리고 사이즈를 하나 증가시킨다. 

size++

 

 

4. 그리고 리스트  끝에(tail이 가리키는 주소) 새 노드를 연결한다. 

tail.next =node;

 

 

5. 새 노드가 현재 노드를 가리키게 한다. 

node.prev = tail;

 

 

6. 끝 노드의 주소를 새 노드로 만든다. - 만듦으로서 결국 tail이 새노드를 가리키게 한다.

tail = node;

 

 

 

 

 

 

 


노드의 값을 꺼내기  : get () {}

 

public void get(int index) {

 


 

1. 위 처럼 index로 값을 꺼낸다. 

 

2. 일단 인덱스의 유효여부를 먼저 검사한다. 

 if ( index < 0 || index >= size)  {

throw new ListException("인덱스의 범위를 초과 했습니다");

}

 

 

인덱스가 유효하다면?

3. 그다음 커서를 헤드부터 시작하도록 만든다. 

Node cursor = head;                                         == 인덱스에 해당하는 노드를 찾을때 head 부터 시작한다는 뜻       

 

 

 

 

4. 반복문을 돌려서 해당 위치로 찾아가게 하자 -                                               == 지정된 인덱스의 노드주소를 알아낸다.

0부터 인덱스까지 반복. 어차피 위에서 유효검사를 했으니 size를 넘을수 없다

for ( int i = 0; i < index; i++) {

 

cursor = cursor.next;          == 현재 커서의 다음노드주소를 가리키고 있다  (현재 노드의 커서가 0번째에 있고 1부터 시작이니 그담번째를 가리긴다는 뜻

 

 

 

5. 현재 cursor 가 가리키는 노드의 값을 꺼내 리턴한다

return cursor.value;

 

 

 


List 에 값을 넣었다가 빼보자


 

public class LinedListTest {

  public staitc void main(String[] args) {

     LinkedList  list  =  new  LinkedList ();

     list.add("홍길동");

     list.add("임꺽정");

     list.add("유관순");

     list.add("안중근");

  }

}

 

sysout(list.get(0));

sysout(list.get(1));

sysout(list.get(2));

sysout(list.get(3));

 

== console ==

홍길동

임꺽정

유관순

안중근

==========

 

 

 

 

 

만약

System.out.println(list.get( -1));

System.out.println(list.get( 4)); 를 호출하면??

 

 

== console ==

 

ListException : 인덱스의 범위를 초과했습니다 !

ListException : 인덱스의 범위를 초과했습니다 !

==========

 

둘다 실행 오류가 뜬다!

 

 

 


노드의 값을 삭제하기  :  remove() {} 구현하기

 

public  void  remove ( int index) {


1. 위처럼 인덱스 유효여부 검사 해준다.

== 똑같음

 

 

2. 삭제할 노드를 찾자     근데 그 전에 시작노드를 head 로 설정한다.

 Node cursor = head;

 

 

3. 삭제할 노드 진짜로 찾자 ㅋㅋ  - 지정된 노드 인덱스 반복문으로 찾기

for ( int i = 0; i < index; i++) {

cursor = cursor.next; 

 

 

4. 찾은 노드의 앞뒤 노드를 바로 연결한다.

 

만약 2번을 삭제 한다면??

 

cursor.prev 에 앞노드 주소가 저장되어있잖아

cursor.prev.next = cursor.next;

 

== 현재노드의 다음 주소를 이전 노드의 next로 저장

 

}else {                            ==삭제할노드가 맨앞노드라면 ??

head =cursor.next;          == 삭제할 다음 녿노드를 시작 노드로 설정한다

 }   

head.prev = null;          == 시작노드가 앞노드를 가리키지 않게 한다

 

 

 


노드 삭제 테스트 


 

중간 노드 삭제 테스트

list.remove(2);   // 유관순 삭제

printList(list);  

 

 

맨 앞 노드 삭제 테스트

list.remove(0);   // 홍길동 삭제

printList(list);   

 

 

맨 마지막노드 삭제 테스트

list.remove(1);   //안중근 삭제

printList(list);

 

 

== console ==

 

임꺽정

안중근

ListException : 인덱스의 범위를 초과했습니다 !

 

==========