1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
struct Solution;
use rustgym_util::*;

impl Solution {
    fn delete_duplicates(mut head: ListLink) -> ListLink {
        let mut res: ListLink = None;
        let mut stack: Vec<(i32, usize)> = vec![];
        while let Some(node) = head {
            let val = node.val;
            match stack.last() {
                Some(&(pval, count)) if pval == val => {
                    stack.pop();
                    stack.push((val, count + 1));
                }
                _ => {
                    stack.push((val, 1));
                }
            }
            head = node.next;
        }
        while let Some((val, count)) = stack.pop() {
            if count == 1 {
                res = ListLink::link(val, res);
            }
        }
        res
    }
}

#[test]
fn test() {
    let head = list!(1, 2, 3, 3, 4, 4, 5);
    let res = list!(1, 2, 5);
    assert_eq!(Solution::delete_duplicates(head), res);
    let head = list!(1, 1, 1, 2, 3);
    let res = list!(2, 3);
    assert_eq!(Solution::delete_duplicates(head), res);
}