// [1,1,2] [1,2]
// [1,1,2,3,3] [1,2,3]
//链表的定义
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>
}
impl ListNode {
#[inline]//内嵌
fn new(val: i32) -> Self {
ListNode {
next: None,
val
}
}
}
// 迭代
pub fn delete_duplicates(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut current = head.as_mut();
while let Some(node) = current {
while let Some(next) = node.next.as_mut() {
if next.val == node.val {
node.next = next.next.take();
} else {
break;
}
}
current = node.next.as_mut();
}
head
}
// 递归
pub fn delete_duplicates2(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
match head {
Some(mut node) => {
node.next = delete_duplicates2(node.next);
if let Some(next) = node.next.as_ref() {
if node.val == next.val {
return node.next;
}
}
Some(node)
}
None => None,
}
}
fn main() {
// 根据测试用例 [1,1,2] [1,2] 写断言
let l1 = Some(Box::new(ListNode {
val: 1,
next: Some(Box::new(ListNode {
val: 1,
next: Some(Box::new(ListNode {
val: 2,
next: None,
})),
})),
}));
let l2 = Some(Box::new(ListNode {
val: 1,
next: Some(Box::new(ListNode {
val: 2,
next: None,
})),
}));
assert_eq!(delete_duplicates(l1.clone()), l2.clone());
assert_eq!(delete_duplicates2(l1.clone()), l2.clone());
}