거꾸로 바라본 세상
반응형


List.java

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

//List 인터페이스,<T>는 타입
public interface List<T> {
    //임의의 위치에 데이터 삽입
    public boolean add(T data, int index);
    //맨 첫번째에 데이터 삽입
    public boolean addFirst(T data);
    //맨 마지막에 데이터 삽입
    public boolean addLast(T data);
    //맨 끝에 데이터 삽입
    public boolean add(T data);
    //인덱스 값을 통해 임의 위치 값 줄력
    public T get(int index);
    //리스트의 크기 값
    public int size();
    //마지막 리스트 의 값 출력
    public T getLast();
    //맨 첫번째 리스트의 값 출력
    public T getFirst();
    //임의 위치에 삭제
    public T remove(int index);
    //첫번째 위치 삭제
    public T removeFirst();
    //마지막 위치 삭제
    public T removeLast();
    //마지막 위치 삭제
    public T remove();
    
    
    
}
cs


LinkedList.java


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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
package min.java.begin;
 
//연결리스트
public class LinkedLists<T> implements Lists<T> {
    //클래스 노드 
    private static class Node<T> {
 
        private T data;
        private Node<T> next;
        //생성자
        Node() {
            data = null;
            next = null;
        }
        //생성자
        Node(final T data) {
            this.data = data;
            this.next = null;
        }
    }
    //리스트 노드의 header
    private Node<T> header = null;
    //리스트의 사이즈 값
    private int size;
    //생성자
    LinkedLists() {
        //객체 생성
        header = new Node<T>();
        size = 0;
    }
    //첫번째 위치 데이터 추가 
    @Override
    public boolean addFirst(T data) {
        Node<T> newNode = new Node<T>(data);
        //리스트에 데이터가 존재하지 않는다면 맨첫번째 위치에 데이터를 추가하는 것.
        if (header == null) {
            header.next = newNode;
            size++;
            return true;
        } else {
            //리스트가 존재하면 기존의 맨앞에 있는 데이터를 뒤로 넘기고 새로운 노드를 앞에 생성
            newNode.next = header.next;
            header.next = newNode;
            size++;
            return true;
        }
    }
    //마지막 위치 데이터 주가
    @Override
    public boolean addLast(T data) {
        if (size == 0) {
            addFirst(data);
            return true;
        } else {
            add(data, size);
            return true;
        }
    }
    //마지막 위치 데이터 주가
    @Override
    public boolean add(T data) {
        add(data, size);
        return true;
    }
    //임의의 위치 데이터 추가
    @Override
    public boolean add(T data, int index) {
        if (index == 0) {
            addFirst(data);
            return true;
        }
        //새로운 노드 생성
        Node<T> newNode = new Node<T>(data);
        //임의의 위치 이전노드
        Node<T> prev = getNode(index - 1);
        //임의의 위치 다음노드
        Node<T> next = prev.next;
        
        // 리스트 중간에 데이터를 삽입하는 과정
        prev.next = newNode;
        newNode.next = next;
        size++;
        return true;
    }
    //임의 위치 리스트 값 출력
    @Override
    public T get(int index) {
        return getNode(index).data;
    }
    //첫번째 리스트 값 출력
    @Override
    public T getFirst() {
        return getNode(0).data;
    }
    //마지막 리스트의 값 출력
    @Override
    public T getLast() {
        return getNode(size - 1).data;
    }
    //모든 리스트의 값 출력
    @Override
    public String toString() {
        Node<T> temp = header.next;
        if (temp == null) {
            return "[ ]";
        } else {
            //StringBuilder 클래스를 이용하여 데이터를 출력
            StringBuilder sb = new StringBuilder("[");
            sb.append(temp.data);
            temp = temp.next;
            while (temp != null) {
                sb.append(", ");
                sb.append(temp.data);
                temp = temp.next;
            }
            sb.append("]");
            return sb.toString();
        }
    }
    //리스트의 개수 출력
    @Override
    public int size() {
        return size;
    }
    //임의의 위치 삭제
    @Override
    public T remove(int index) {
        if (index > size) {
            throw new IndexOutOfBoundsException("Index overflow is " + index + ", size is " + size);
        }
        if (size <= 0 || index < 0) {
            throw new IndexOutOfBoundsException("Not data error, size is " + size);
        } else if (index == 0) {
            return removeFirst();
        } else {
            Node<T> prev = getNode(index - 1);
            Node<T> remove = prev.next;
            prev.next = remove.next;
            size--;
            return remove.data;
        }
    }
    //첫번째 위치 삭제
    @Override
    public T removeFirst() {
        if (size <= 0) {
            throw new IndexOutOfBoundsException("Not data error, size is " + size);
        } else {
            Node<T> temp = getNode(0);
            header.next = temp.next;
            size--;
            return temp.data;
        }
 
    }
    //마지막 위치 삭제
    @Override
    public T removeLast() {
        if (size <= 0) {
            throw new IndexOutOfBoundsException("Not data error, size is " + size);
        } else {
            return remove(size - 1);
        }
    }
    //마지막 위치 삭제
    @Override
    public T remove() {
        return removeLast();
    }
    public Node<T> getNode(int index) {
        //인덱스값이 -1이거나  인덱스가 사이즈보다 크다면 Exception 에러 출력
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("index is : " + index + "size : " + size);
        }
        Node<T> move = header.next;
        int i = 0;
        //index 위치까지 노드 이동
        while (i < index) {
            move = move.next;
            i++;
        }
        return move;
    }
 
}
 
cs


반응형

'Language > Java' 카테고리의 다른 글

[NIO] 파일 채널(FileChannel)  (0) 2016.04.06
달력만들기  (0) 2016.03.25
Java 줄바꿈 처리  (0) 2016.03.07
SocketAddress 클래스와 NetworkInterface 클래스  (0) 2015.12.17
InetAddress 클래스  (0) 2015.12.16
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!