use crate::linked_list::singly_linked_list::ListNode;
pub fn remove_nth_from_end<T: Clone + Default>(
head: Option<Box<ListNode<T>>>,
n: usize,
) -> Option<Box<ListNode<T>>> {
let mut dummy = Box::new(ListNode::new(Default::default()));
dummy.next = head;
let mut fast: *mut ListNode<T> = &mut *dummy;
let mut slow: *mut ListNode<T> = &mut *dummy;
unsafe {
for _ in 0..=n {
if let Some(ref mut next) = (*fast).next {
fast = &mut **next as *mut _;
} else {
return dummy.next;
}
}
while let Some(ref mut next) = (*fast).next {
fast = &mut **next as *mut _;
if let Some(ref mut next2) = (*slow).next {
slow = &mut **next2 as *mut _;
}
}
let to_remove = (*slow).next.as_mut().map(|n| n.next.take());
(*slow).next = to_remove.unwrap_or(None);
}
dummy.next
}