rustgym/leetcode/
_707_design_linked_list.rs1use 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}