题解 | #从单向链表中删除指定值的节点#

从单向链表中删除指定值的节点

https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f

// #![feature(linked_list_cursors)]
use std::io::{self, *};
// use std::collections::LinkedList;

// type Link = Option<Box<Node<T>>>;

#[derive(Clone, Debug)]
struct Node<T> {
    v: T,
    next: Option<Box<Node<T>>>
}

struct List<T> {
    head: Option<Box<Node<T>>>
}

impl<T: std::cmp::PartialEq> List<T> {

    fn remove(&mut self, elem: T) {
        if self.head.is_some() && self.head.as_ref().unwrap().v == elem {
            self.head = self.head.as_mut().unwrap().next.take();
            return
        } 
        let mut this = &mut self.head;
        while let Some(x) = &mut this.as_mut().unwrap().next {
            if x.as_ref().v == elem {
                this.as_mut().unwrap().next = x.next.take();
            }
            this = &mut this.as_mut().unwrap().next;
        }
    }

}

impl<T: std::cmp::PartialEq> Node<T> {
    fn new(elem: T) -> Self {
        Node {
            v: elem,
            next: None,
        }
    }
    
    fn set_next(&mut self, node: Self) {
        self.next = Some(Box::new(node));
    }

    fn find<'a>(&'a mut self, anchorv: T) -> Option<&'a mut Self> {
        if self.v == anchorv {
            return Some(self);
        }
        if let Some(ref mut x) = self.next {
            return x.find(anchorv);
        } 
        None
    }
    
    fn insert_after<'a>(&'a mut self, elem: T, anchorv: T) -> bool {
        if let Some(x) = self.find(anchorv) {
            let node = Node {
                v: elem,
                next: x.next.take(),
            };
            x.set_next(node);
            true
        } else {
            false
        }
    }
}

fn main() {
    let stdin = io::stdin();
    let mut line = String::new();
    stdin.read_line(&mut  line);
    let mut ns = line.trim().split(" ");
    let n = ns.next().unwrap().parse::<u16>().unwrap();
    // let mut l = LinkedList::new();
    // l.push_back(ns.next().unwrap().parse::<u16>().unwrap());
    // for i in 1..n {
    //     let nextv = ns.next().unwrap().parse::<u16>().unwrap();
    //     let anchorv = ns.next().unwrap().parse::<u16>().unwrap();
    //     let mut cursor = l.cursor_front_mut();
    //     while *cursor.current().unwrap() != anchorv {
    //         cursor.move_next();
    //     }
    //     if let Some(c) = cursor.current() {
    //         cursor.insert_after(nextv);
    //     }
    // }
    // let delectv = ns.next().unwrap().parse::<u16>().unwrap();
    // let mut cursor = l.cursor_front_mut();
    // while *cursor.current().unwrap() != delectv {
    //     cursor.move_next();
    // }
    // if let Some(c) = cursor.current() {
    //     cursor.remove_current();
    // }
    // for i in l.iter() {
    //     print!("{} ", i)
    // }

    let mut l = List {head: Some(Box::new( Node::new(ns.next().unwrap().parse::<u16>().unwrap())) )};
    for i in 1..n {
        l.head.as_mut().unwrap().insert_after(ns.next().unwrap().parse::<u16>().unwrap(), ns.next().unwrap().parse::<u16>().unwrap());
    }
    l.remove(ns.next().unwrap().parse::<u16>().unwrap());
    let mut this = l.head;
    while let Some(node) = this {
        print!("{} ", node.v);
        this = node.next;
    }


}

全部评论

相关推荐

04-17 10:16
门头沟学院 Java
小浪_coder:24届很难找了,马上25的都毕业了还有很多没找到的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务