rustgym/leetcode/
_707_design_linked_list.rs

1use rustgym_util::*;
2
3#[derive(Debug, PartialEq, Eq, Clone, Default)]
4struct MyLinkedList {
5    head: ListLink,
6}
7
8impl MyLinkedList {
9    fn new() -> Self {
10        MyLinkedList { head: None }
11    }
12
13    fn get(&self, index: i32) -> i32 {
14        if index < 0 {
15            return -1;
16        }
17        let mut i = 0;
18        let mut link: &ListLink = &self.head;
19        while let Some(node) = link {
20            if i == index {
21                return node.val;
22            }
23            i += 1;
24            link = &node.next;
25        }
26        -1
27    }
28
29    fn add_at_head(&mut self, val: i32) {
30        self.head = ListLink::link(val, self.head.take());
31    }
32
33    fn add_at_tail(&mut self, val: i32) {
34        let mut link: &mut ListLink = &mut self.head;
35        while let Some(node) = link {
36            link = &mut node.next;
37        }
38        *link = ListLink::link(val, None);
39    }
40
41    fn add_at_index(&mut self, index: i32, val: i32) {
42        if index <= 0 {
43            self.add_at_head(val);
44        } else {
45            let mut i = 0;
46            let mut link: &mut ListLink = &mut self.head;
47            while let Some(node) = link {
48                if index == i + 1 {
49                    node.next = ListLink::link(val, node.next.take());
50                    return;
51                } else {
52                    link = &mut node.next;
53                    i += 1;
54                }
55            }
56        }
57    }
58
59    fn delete_at_index(&mut self, index: i32) {
60        if index < 0 {
61            return;
62        }
63        let mut i = 0;
64        let mut link: &mut ListLink = &mut self.head;
65        loop {
66            match link {
67                None => {
68                    return;
69                }
70                Some(node) if index == i => {
71                    *link = node.next.take();
72                    return;
73                }
74                Some(node) => {
75                    link = &mut node.next;
76                    i += 1;
77                }
78            }
79        }
80    }
81}
82
83#[test]
84fn test() {
85    let mut obj = MyLinkedList::new();
86    obj.add_at_head(1);
87    obj.add_at_tail(3);
88    obj.add_at_index(1, 2);
89    assert_eq!(obj.get(1), 2);
90    obj.delete_at_index(1);
91    assert_eq!(obj.get(1), 3);
92    let mut obj = MyLinkedList::new();
93    obj.add_at_head(1);
94    obj.add_at_index(1, 2);
95    assert_eq!(obj.get(1), 2);
96}