View difference between Paste ID: HVpQAxp1 and CU4tsmvj
SHOW: | | - or go back to the newest paste.
1
import java.util.Iterator;
2
 
3
public class SimpleLinkedList<ELEMENT extends Comparable<ELEMENT>> implements ILinkedList<ELEMENT> {
4
 
5
    //region Node Class
6
 
7
    private class Node<ELEMENT> {
8
        public ELEMENT item;
9
        public Node<ELEMENT> next;
10
 
11
        public Node() {
12
            this(null, null);
13
        }
14
        public Node(ELEMENT item) {
15
            this(item, null);
16
        }
17
        public Node(ELEMENT item, Node<ELEMENT> next) {
18
            this.item = item;
19
            this.next = next;
20
        }
21
 
22
        @Override
23
        public String toString() {
24
            return this.item.toString();
25
        }
26
    }
27
    //endregion
28
 
29
    //region Attributes
30
 
31
    protected Node<ELEMENT> head;
32
    protected int count;
33
    protected Node<ELEMENT> tail;
34
    //endregion
35
 
36
    //region Constructors
37
 
38
    public SimpleLinkedList() {
39
        this.head = null;
40
        this.count = 0;
41
        this.tail = null;
42
    }
43
    //endregion
44
 
45
    //region Linked List Methods
46
 
47
    // Returns the number of elements in this list.
48
    public int size() {
49
        return this.count;
50
    }
51
 
52
    public void addFirstRookieVersion(ELEMENT item) {
53
        if (this.count == 0) {
54
            this.head = this.tail = new Node<ELEMENT>(item, null);
55
            ++this.count;
56
        } else {
57
            Node<ELEMENT> temp = new Node<ELEMENT>(item, null);
58
            temp.next = this.head;
59
            this.head = temp;
60
            ++this.count;
61
        }
62
    }
63
    // Inserts the specified element at the beginning of this list.
64
    public void addFirst(ELEMENT item) {
65
        Node<ELEMENT> temp = new Node<ELEMENT>(item, this.head);
66
        if (this.count == 0) {
67
            this.tail = temp;
68
        }
69
        this.head = temp;
70
        ++this.count;
71
    }
72
 
73
    public void addLastRookieVersion(ELEMENT item) {
74
        if (this.count == 0) {
75
            this.head = this.tail = new Node<ELEMENT>(item, null);
76
            ++this.count;
77
        } else {
78
            Node<ELEMENT> temp = new Node<ELEMENT>(item, null);
79
            this.tail.next = temp;
80
            this.tail = temp;
81
            ++this.count;
82
        }
83
    }
84
    // Appends the specified element to the end of this list.
85
    public void addLast(ELEMENT item) {
86
        Node<ELEMENT> temp = new Node<ELEMENT>(item, null);
87
        if (this.count == 0) {
88
            this.head = temp;
89
        } else {
90
            this.tail.next = temp;
91
        }
92
        this.tail = temp;
93
        ++this.count;
94
    }
95
 
96
    // Removes and returns the first element from this list.
97
    public ELEMENT removeFirst() {
98
        if (this.count == 0) {
99
            throw new RuntimeException("La lista está vacía...");
100
        }
101
        ELEMENT item = this.head.item;
102
        this.head = this.head.next;
103
        if (this.head == null) {
104
            this.tail = null;
105
        }
106
        --this.count;
107
        return item;
108
    }
109
 
110
    // Removes and returns the last element from this list.
111
    public ELEMENT removeLast() {
112
        if (this.count == 0) {
113
            throw new RuntimeException("La lista está vacía...");
114
        }
115
        ELEMENT item = this.tail.item;
116
        if (this.head.next == null) {
117
            this.head = this.tail = null;
118
        } else {
119
            Node<ELEMENT> skip = this.head;
120
            while (skip.next.next != null) {
121
                skip = skip.next;
122
            }
123
            this.tail = skip;
124
            this.tail.next = null;
125
        }
126
        --this.count;
127
        return item;
128
    }
129
    //endregion
130
 
131
    public void Mostrar() {
132
    	for (Node skip = this.head; skip!= null; skip = skip.next) {
133
    		System.out.printf("%s ", skip.toString() );
134
    	}
135
    }
136
    
137
    public void addInOrder(ELEMENT item) {
138
        if (this.size() == 0) {
139
            this.head = this.tail = new Node<ELEMENT>(item, null);
140
            ++this.count;
141
        }
142
        else {
143
            if (item.compareTo(this.head.item) <= 0) {
144
                this.addFirst(item);
145
            }
146
            else {
147
                if (item.compareTo(this.tail.item) > 0) {
148
                    this.addLast(item);
149
                }
150
                else {
151
                    Node<ELEMENT> skip = this.head;
152
                    while ((skip != null) && (skip.next != null) && (item.compareTo(skip.next.item) > 0)) {
153
                        skip = skip.next;
154
                    }
155
                    if (skip == null) {
156
                        throw new RuntimeException("Algo está mal en el orden de los elementos de la lista...");
157
                    }
158
                    else {
159
                        Node<ELEMENT> temp = new Node<ELEMENT>(item, skip.next);
160
                        skip.next = temp;
161
                        ++this.count;
162
                    }
163
                }
164
            }
165
        }
166
 
167
    }
168
    
169
    
170
    
171
    
172
    //region Object Methods
173
 
174
    @Override
175
    public String toString() {
176
 
177
        if (this.size() <=0) {
178
            return "";
179
        }
180
 
181
        // from https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/StringBuilder.html
182
        StringBuilder sb = new StringBuilder();
183
 
184
        sb.append("[" + this.head.item.toString());
185
        for (Node<ELEMENT> skip = this.head.next; skip != null; skip = skip.next) {
186
            sb.append(", " + skip.item.toString());
187
        }
188
        sb.append("]");
189
 
190
        return sb.toString();
191
    }
192
    //endregion
193
 
194
 
195
    //region Iterable Methods
196
    @Override
197
    public Iterator<ELEMENT> iterator() {
198
        return new SimpleLinkedListIterator(this.head);
199
    }
200
 
201
    private class SimpleLinkedListIterator implements Iterator<ELEMENT> {
202
        private Node<ELEMENT> current;
203
 
204
        public SimpleLinkedListIterator(Node<ELEMENT> current) {
205
            this.current = current;
206
        }
207
 
208
        @Override
209
        public boolean hasNext() {
210
            return this.current != null;
211
        }
212
 
213
        @Override
214
        public ELEMENT next() {
215
            if (!this.hasNext()) {
216
                throw new RuntimeException("La lista está vacía...");
217
            }
218
            ELEMENT item = this.current.item;
219
            this.current = this.current.next;
220
            return item;
221
        }
222
 
223
    }
224
 
225
 
226
    //endregion
227
 
228
}