easy_linked_list/easy_linked_list/
mod.rs

1struct Node<T> {
2    data: T,
3    next: Option<Box<Node<T>>>,
4}
5
6impl<T> Node<T> {
7    fn new(data: T) -> Self {
8        Node { data, next: None }
9    }
10}
11
12///this is unsize generic list for stored any type
13///
14///
15/// # Examples
16///
17/// ```
18///#[derive(Debug)] //struct example
19///struct Person {
20///    name: String,
21///    age: i32,
22///}
23///let mut persons = List::new(); //declare package
24///
25///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element
26///
27/// ```
28pub struct List<T> {
29    head: Option<Box<Node<T>>>,
30}
31
32///this is unsize generic list for stored any type
33///
34///
35/// # Examples
36///
37/// ```
38///#[derive(Debug)] //struct example
39///struct Person {
40///    name: String,
41///    age: i32,
42///}
43///let mut persons = List::new(); //declare package
44///
45///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element
46///
47/// ```
48impl<T> List<T> {
49    pub fn new() -> Self {
50        List { head: None }
51    }
52
53    ///this method used for insert in the list
54    ///
55    ///
56    /// # Examples
57    ///
58    /// ```
59    ///#[derive(Debug)] //struct example
60    ///struct Person {
61    ///    name: String,
62    ///    age: i32,
63    ///}
64    ///let mut persons = List::new(); //declare package
65    ///
66    ///persons.add(Person { name: "saeed".to_string(), age: 25 });// insert element
67    ///
68    /// ```
69    pub fn add(&mut self, data: T) {
70        let new_node = Box::new(Node::new(data));
71        match self.head {
72            Some(ref mut head) => {
73                let mut current = head;
74                while let Some(ref mut next_node) = current.next {
75                    current = next_node;
76                }
77                current.next = Some(new_node);
78            }
79            None => {
80                self.head = Some(new_node);
81            }
82        }
83    }
84
85    ///this method used for remove all elements in the list
86    ///
87    ///
88    /// # Examples
89    ///
90    /// ```
91    ///#[derive(Debug)] //struct example
92    ///struct Person {
93    ///    name: String,
94    ///    age: i32,
95    ///}
96    ///let mut persons = List::new(); //declare package
97    ///
98    ///persons.clear();// remove all elements
99    ///
100    /// ```
101    pub fn clear(&mut self) {
102        self.head = None;
103    }
104
105    ///this method used for insert in the list
106    ///
107    ///# Arguments
108    ///
109    /// * `index` - index of the value you want to get from list.
110    ///
111    ///
112    /// # Examples
113    ///
114    /// ```
115    ///#[derive(Debug)] //struct example
116    ///struct Person {
117    ///    name: String,
118    ///    age: i32,
119    ///}
120    ///let mut persons = List::new(); //declare package
121    ///
122    ///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element index=>0
123    ///persons.add(Person { name: "safi".to_string(), age: 26 });// set element index=>1
124    ///
125    ///persons.get_by_index(1);// get element by index
126    ///
127    /// ```
128    pub fn get_by_index(&self, index: usize) -> Option<&T> {
129        let mut current = &self.head;
130        let mut current_index = 0;
131        while let Some(ref node) = *current {
132            if current_index == index {
133                return Some(&node.data);
134            }
135            current_index += 1;
136            current = &node.next;
137        }
138        None
139    }
140
141    ///this method used for remove element with specefic index
142    ///
143    ///# Arguments
144    ///
145    /// * `index` - index of the value you want to get from list.
146    ///
147    ///
148    /// # Examples
149    ///
150    /// ```
151    ///#[derive(Debug)] //struct example
152    ///struct Person {
153    ///    name: String,
154    ///    age: i32,
155    ///}
156    ///let mut persons = List::new(); //declare package
157    ///
158    ///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element index=>0
159    ///persons.add(Person { name: "safi".to_string(), age: 26 });// set element index=>1
160    ///
161    ///persons.remove_index(1);// remove element by index
162    ///
163    /// ```
164    pub fn remove_index(&mut self, index: usize) -> Option<T> {
165        let mut current = &mut self.head;
166        for _ in 0..index - 1 {
167            if let Some(ref mut node) = *current {
168                current = &mut node.next;
169            } else {
170                return None;
171            }
172        }
173        current.as_mut().and_then(|node| {
174            node.next.take().map(|next_node| {
175                let next_data = next_node.data;
176                node.next = next_node.next;
177                next_data
178            })
179        })
180    }
181
182    ///this method used for get first element in the list
183    ///
184    ///
185    /// # Examples
186    ///
187    /// ```
188    ///#[derive(Debug)] //struct example
189    ///struct Person {
190    ///    name: String,
191    ///    age: i32,
192    ///}
193    ///let mut persons = List::new(); //declare package
194    ///
195    ///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element
196    ///persons.add(Person { name: "safi".to_string(), age: 26 });// set element
197    ///
198    ///persons.first();// return first element inthe list
199    ///
200    /// ```
201    pub fn first(&self) -> Option<&T> {
202        self.head.as_ref().map(|node| &node.data)
203    }
204
205    ///this method used for get last element in the list
206    ///
207    ///
208    /// # Examples
209    ///
210    /// ```
211    ///#[derive(Debug)] //struct example
212    ///struct Person {
213    ///    name: String,
214    ///    age: i32,
215    ///}
216    ///let mut persons = List::new(); //declare package
217    ///
218    ///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element
219    ///persons.add(Person { name: "safi".to_string(), age: 26 });// set element
220    ///
221    ///persons.last();// return last element inthe list
222    ///
223    /// ```
224    pub fn last(&self) -> Option<&T> {
225        let mut current = &self.head;
226        while let Some(ref node) = *current {
227            if node.next.is_none() {
228                return Some(&node.data);
229            }
230            current = &node.next;
231        }
232        None
233    }
234
235    ///this method used for get index of element in the list
236    ///
237    ///# Arguments
238    ///
239    /// * `value` - value type that you gave to list<T:as you passed> .
240    ///
241    ///
242    /// # Examples
243    ///
244    /// ```
245    ///let mut list = List::new(); //declare package
246    ///
247    /// // i32 example
248    ///list.add(1);
249    ///list.add(2);
250    ///list.add(4);
251    ///
252    ///println!("Index of 2: {:?}", list.get_index(&2)); //return 1
253    /// ```
254    pub fn get_index(&self, value: &T) -> Option<usize> where T: PartialEq {
255        let mut current = &self.head;
256        let mut index = 0;
257        while let Some(ref node) = *current {
258            if &node.data == value {
259                return Some(index);
260            }
261            index += 1;
262            current = &node.next;
263        }
264        None
265    }
266
267    ///this method used for get next element in the list
268    ///
269    ///# Arguments
270    ///
271    /// * `value` - value type that you gave to list<T:as you passed> .
272    ///
273    ///
274    /// # Examples
275    ///
276    /// ```
277    ///let mut list = List::new(); //declare package
278    ///
279    /// // i32 example
280    ///list.add(1);
281    ///list.add(2);
282    ///list.add(4);
283    ///
284    /// println!("Next after 2: {:?}", list.next(&2)); //return 4
285    /// ```
286    pub fn next(&self, value: &T) -> Option<&T> where T: PartialEq {
287        let mut current = &self.head;
288        while let Some(ref node) = *current {
289            if &node.data == value {
290                return node.next.as_ref().map(|next_node| &next_node.data);
291            }
292            current = &node.next;
293        }
294        None
295    }
296
297    ///this method used for find ount an element is the last of elemnts in the list or not
298    ///
299    ///# Arguments
300    ///
301    /// * `value` - value type that you gave to list<T:as you passed> .
302    ///
303    ///
304    /// # Examples
305    ///
306    /// ```
307    ///let mut list = List::new(); //declare package
308    ///
309    /// // i32 example
310    ///list.add(1);
311    ///list.add(2);
312    ///list.add(4);
313    ///
314    /// println!("Is 3 last index: {:?}", list.is_last_index(&4)); //return true
315    /// ```
316    pub fn is_last_index(&self, value: &T) -> bool where T: PartialEq {
317        if let Some(index) = self.get_index(value) {
318            let mut current = &self.head;
319            let mut i = 0;
320            while let Some(ref node) = *current {
321                if i == index {
322                    return node.next.is_none();
323                }
324                i += 1;
325                current = &node.next;
326            }
327        }
328        false
329    }
330
331    ///return simple rust array 
332    pub fn to_array(&self) -> Vec<&T> {
333        let mut array = Vec::new();
334        let mut current = &self.head;
335        while let Some(ref node) = *current {
336            array.push(&node.data);
337            current = &node.next;
338        }
339        array
340    }
341}