본문 바로가기

Development Note

Data Structure - ② Linked List

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
요번에는 소스코드를 한번.. 분석을 해보겠습니다.. -_-;; 제꺼라서 잘 설명할 자신이 있어요.. -_-;; 아래 포스팅한 글에서 보셨듯이 기본적으로 가지고 있어야할 멤버 변수들로는 리스트의 길이와.. 첫 노드가 무엇인지에 대한 정보를 담고 있는 firstNode 라는 객체가 있습니다. 그럼 노드가 무엇이고 어디다 쓰느냐??


사용자 삽입 이미지

요것이 리스트의 Inner Class (내부 클래스) 로 삽입이 되어있는 Node 클래스 입니다. 물론 이 클래스를 따로 빼두어도 됩니다만.. 저는 내부 클래스로 사용을 했습니다. 접근 제어자는 모두 private.. 이게 왜 링크 기반의 리스트인지를 절실히 알려주는 부분이 바로 저!!! 부분입니다!! 4번째줄의 private Node next; 이부분이죠.. 노드라는 객체는 항상 다음 노드에 대한 정보를 담고 있기 때문입니다. 그래서 노드끼리 줄줄이 연결이 되는거구요.. ^^

이걸 첨 배울때 좀 이상하게 생각을 했었는데.. 그게 뭐냐믄 -_-;; 노드를 만들어주고 어디다 담아 놓지 않으면.. 없어지지 않느냐?? 라는 것이었습니다. 하지만.. 이 next 변수 안에 그 해답이 있던거였죠..

다음으로 요소를 추가하는 add 메소드를 알아보도록 하겠습니다.
사용자 삽입 이미지
T newEntry 를 매개변수로 가지는 add 메소드도 있는데.. 그건 쉽게 이해하실수 있으니까.. 특정 부분에 요소를 추가하는.. 매개변수가 2개인 add 메소드를 설명하겠습니다. T형의 값을 가진 노드를 만들어 주고.. 일단 숫자 값으로 들어오는 position의 값이 절대로 리스트보다 크거나.. 작거나 하면 안되겠죠..? 그리고 그 숫자가 어떠냐.. 의 경우로 3가지를 들수가 있는데.. 요소를 삽입하고자 하는 위치가.. 맨 앞인경우와 맨 끝인 경우.. 그외의 경우들이 있는데 맨 끝인 경우부터 코딩을 했군요.. 저럴때는 그냥.. 추가하는거랑 똑같죠..? 그다음 맨 앞인 경우는 firstNode의 값이 바뀌는것이기때문에.. 기존 firstNode를 없애주고.. 새로 들어오는 값을 firstNode로 해주고.. 예전에 firstNode였던 값을 다음 값으로 설정해주면 됩니다 +_+ (말이 좀 어렵죠...)

그다음.. 처음이나 끝이 아닌경우에는 두 노드 사이에 끼워넣기만 하면 되는거죠.. 원하는 위치의 이전 노드의 next 변수의 값이 새로 추가될 노드이고.. 새로 추가된 노드의 next 값은 기존의 next 노드인거죠 +_+

이게 참.. 말로 설명하기가 거시기 해서.. 그림으로도 한번 보여드리겠습니다..

사용자 삽입 이미지
이게 초기값이라고 생각을 해봅시다..

0부터 4까지 순서대로 넣어야된다고 가정을 하면.. 0과 2가 빠졌죠?
요걸 넣어보면.. 쉽게 이해가 가실겁니다. 네모를 노드라고 보시고.. 화살표가 가르키는것을
next 변수라고 생각하시면 되겠습니다!
사용자 삽입 이미지

먼저 2를 추가 해야하는데요.. 2를 추가할려면? 그냥 add 메소드로는 안되죠.. 특정 위치에 넣는 add를 사용해야 합니다. 이런경우에는 2를 담고 있는 노드를 만들어주고 1노드가 가리키는 노드를 2 노드로 바꾸어주고.. 2노드가 가리키는 노드를 3노드로 해주면 됩니다 +_+
사용자 삽입 이미지
그러면 0은 어떻게 넣는가? 이건 더 쉽습니다. 0이라는 노드를 만들어주고요.. 다음 노드를 1로 해주면 됩니다. 하지만!! 여기서 주의할점은 firstNode이라는 멤버 변수도 0노드로 바꾸어 주어야 한다는 사실 +_+
하하.. 그림이 있으니까 참 쉽죠 -_-? 아.. 근데 getNodeAt 이라는 메소드가 없다구요?

사용자 삽입 이미지

이놈은.. 원래 인터페이스에 정의 되어 있지는 않지만.. 필요한 메소드지요.. 해당 위치에 가서 해당 노드를 가져오는 놈이에요 +_+.. 링크 기반이라는 놈의 특징은 요소를 찾아오려면 firstNode에서 부터 줄줄이 찾아와야 하기때문에 반복되는 메소드를 위 처럼 캡슐화 시킨겁니다.

사용자 삽입 이미지
이건 지우는 remove 메소드 인데요 ^^ add 메소드와 반대라고 생각하시면 됩니다 +_+ 이번엔 역으로 화살표를 없애주시면 됩니다!!

휴.. 오랜만에 링크드 리스트를 만들어 보았는데요.. 어렵기도하고.. 중간중간에 확확 깨는게.. 공부는 열심히하고 볼일입니다 ^^;; 아마 복습안했으면.. ㅠㅠ 큰일날 뻔했드랬죠.. ㅋ 아자아자.. 공부나 하자 -_-??? ㅋㅋㅋ


이건 제가 연습한 소스 파일예제입니다 +_+