본문 바로가기

IT/기타

환형 연결 리스트 [circular linked list]

일반적인 연결 리스트 구조는 처음 노드와 마지막 노드가 분명하게 구분되는선형 리스트인데 마지막 노드의 LINK 필드값은 항상 「(null)」이었다. 이와 같은 선형 리스트를 좀 더 융통성있게 처리하고 마지막 노드의 LINK 필드를 활용하기 위해서 마지막 노드의 LINK 필드가 null이 아닌 첫 번째 노드의 주소를 지적하도록 리스트를 구성할 수 있는데, 이렇게 구성된 리스트를 환형 연결 리스트라 합니다

 

 

단일 환형 연결 리스트

 

 

위 그림을 간략하게 자바스크립트로 표현 하면 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
var firstNode = {
        data: 12,
        next: null,
    };
    firstNode.next = firstNode;
 
    var secondNode = {
        data: 99,
        next: null
    };
    firstNode.next = secondNode;
    secondNode.next = firstNode;

프로토타입을 만들어 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    function CircularLinkedList(){
        this._length = 0;
        this._head = null;
    }
 
    CircularLinkedList.prototype = {
        add: function(data){
            var node = {
                    data:data,
                    next:null
                },
                current;
 
            if(this._head === null){
                node.next = node;
                this._head = node;
            }
            else{
                current = this._head;
                while(!(current.next==this._head)){
                    current = current.next;
                }
                current.next = node;
                node.next = this._head;
            }
            
            this._length++;
        },
 
        item: function(index){
            if(index > -1 && index < this._length){
                var current = this._head,
                    i = 0;
 
                while(i++ < index){
                    current = current.next;
                }
 
                return current.data;
            }
            else{
                return null;
            }
        },
 
        remove: function(index){
            if(index > -1 && index < this._length){
                var current = this._head,
                    previous,
                    i=0;
 
                if(index === 0){
                    this._head = current.next;
                }
                else{
                    while(i++ < index){
                        previous = current;
                        current = current.next;
                    }
    
                    previous.next = current.next;
                }
    
                this._length--;
    
                return current.data;
            }
            else{
                return null;
            }
        }
    };
 
    var list = new CircularLinkedList();
    list.add("red");
     list.add("orange");
      list.add("yellow");
      
     console.log(list);

 

 

이중 환형 연결 리스트

 

 

 

위 그림을 간략하게 자바스크립트로 표현 하면 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var firstNode = {
        data: 12,
        next: null,
        prev: null
    };
    firstNode.next = firstNode;
    firstNode.prev = firstNode;
    
    var secondNode = {
        data: 99,
        prev: firstNode,
        next: null
    };
    firstNode.prev = secondNode;
    firstNode.next = secondNode;
    secondNode.prev = firstNode;
    secondNode.next = firstNode;

 

프로토타입을 만들어 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
    function CircularDoublyLinkedList(){
        this._length = 0;
        this._head = null;
        this._tail = null;
    }
 
    CircularDoublyLinkedList.prototype = {
        add: function(data){
            var node = {
                data: data,
                next: null,
                prev: null,
            };
 
            if(this._length == 0){
                node.prev = node;
                node.next = node;
                this._head = node;
                this._tail = node;
            }
            else{
                node.next = this._tail.next;
                node.prev = this._tail;
                this._tail.next.prev = node;
                this._tail.next = node;
                this._tail = node;
            }
    
            this._length++;
        },
 
        item: function(index){
            if (index > -1 && index < this._length){
                var current = this._head,
                    i = 0;
                    
                while(i++ < index){
                    current = current.next;            
                }
            
                return current.data;
            } 
            else {
                return null;
            }
        },
        
        remove: function(index){
            if(index > -1 && index < this._length){
                var current = this._head,
                    i = 0;
 
                if(index === 0){
                    this._head = current.next;
                    
                    if(!this._head){
                        this._tail = null;
                    }
                    else{
                        this._head.prev = this._tail;
                        this._tail.next = this._head;
                    }
                }
                else if(index === this._length-1){
                    current = this._tail;
                    this._tail = current.prev;
                    this._tail.next = current.next;
                    this._head.prev = this._tail;
                }
                else{
                    while(i++ < index){
                        current = current.next;
                    }
                    
                    current.next.prev = current.prev;
                    current.prev.next = current.next;
                }
 
                this._length--;
 
                return current.data;
            }
            else{
                return null;
            }
        }
    };
 
    var list = new CircularDoublyLinkedList();
    list.add("red");
    list.add("orange");
    list.add("yellow");
    
    console.log(list);

 

 

 

 

 

 

'IT > 기타' 카테고리의 다른 글

MSSQL MDB변환  (0) 2015.06.08
반응형 웹  (0) 2014.12.01
이중 연결 리스트 [doubly linked list]  (0) 2014.11.25
mysql group_concat함수의 길이 제한  (0) 2014.11.25
split join을 이용한 메뉴 만들기  (0) 2014.04.14