rustgym 0.2.0

rustgym solutions
Documentation
use rustgym_util::*;

#[derive(Debug, PartialEq, Eq, Clone, Default)]
struct MyLinkedList {
    head: ListLink,
}

impl MyLinkedList {
    fn new() -> Self {
        MyLinkedList { head: None }
    }

    fn get(&self, index: i32) -> i32 {
        if index < 0 {
            return -1;
        }
        let mut i = 0;
        let mut link: &ListLink = &self.head;
        while let Some(node) = link {
            if i == index {
                return node.val;
            }
            i += 1;
            link = &node.next;
        }
        -1
    }

    fn add_at_head(&mut self, val: i32) {
        self.head = ListLink::link(val, self.head.take());
    }

    fn add_at_tail(&mut self, val: i32) {
        let mut link: &mut ListLink = &mut self.head;
        while let Some(node) = link {
            link = &mut node.next;
        }
        *link = ListLink::link(val, None);
    }

    fn add_at_index(&mut self, index: i32, val: i32) {
        if index <= 0 {
            self.add_at_head(val);
        } else {
            let mut i = 0;
            let mut link: &mut ListLink = &mut self.head;
            while let Some(node) = link {
                if index == i + 1 {
                    node.next = ListLink::link(val, node.next.take());
                    return;
                } else {
                    link = &mut node.next;
                    i += 1;
                }
            }
        }
    }

    fn delete_at_index(&mut self, index: i32) {
        if index < 0 {
            return;
        }
        let mut i = 0;
        let mut link: &mut ListLink = &mut self.head;
        loop {
            match link {
                None => {
                    return;
                }
                Some(node) if index == i => {
                    *link = node.next.take();
                    return;
                }
                Some(node) => {
                    link = &mut node.next;
                    i += 1;
                }
            }
        }
    }
}

#[test]
fn test() {
    let mut obj = MyLinkedList::new();
    obj.add_at_head(1);
    obj.add_at_tail(3);
    obj.add_at_index(1, 2);
    assert_eq!(obj.get(1), 2);
    obj.delete_at_index(1);
    assert_eq!(obj.get(1), 3);
    let mut obj = MyLinkedList::new();
    obj.add_at_head(1);
    obj.add_at_index(1, 2);
    assert_eq!(obj.get(1), 2);
}