리스트 노드
노드는 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 : 인덱스의 범위를 초과했습니다 !
==========