博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++&Rust]LeetCode No.203 移除链表元素(每日一题)
阅读量:4049 次
发布时间:2019-05-25

本文共 1497 字,大约阅读时间需要 4 分钟。

原贴地址:

题目

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

 

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7输出:[]

 

提示:

  • 列表中的节点在范围 [0, 104]
  • 1 <= Node.val <= 50
  • 0 <= k <= 50

思路分析

本题的难点就在于对链表的操作,如果这个链表是一个形式如示例3的链表,删除完之后可能会连原先的head节点都会被删除,但是如果我们捏着head不放,根本就没法删head,怎么办呢。

这里就会说到一个常用的做链表题的手段了,就是添加watch节点。

原来是7->7->7->7->null
添加了watch之后 变成了watch->7->7->7->7->null

这样操作以后,我们就不用担心对之前的head节点做什么操作了,因为head已经变成了一个普通的节点,无需顾虑。操作完之后,我们不返回之前的head,因为head可能已经不知道去哪儿了。所以我们返回watch->next即可,不管这个链表处理完是什么样,watch都不会对链表的操作产生影响,这也是为什么它叫watch,因为它只是起一个辅助作用。

C++代码

class Solution {
public: ListNode* removeElements(ListNode* head, int val) {
ListNode * watch = new ListNode(0); watch->next = head; ListNode* cur = watch; while (cur->next) {
if (cur->next->val == val) {
cur->next = cur->next->next; } else {
cur = cur->next; } } return watch->next; }};

Rust代码

impl Solution {    pub fn remove_elements(head: Option
>, val: i32) -> Option
> { let mut watch = ListNode { val: 0, next: head }; let mut pre = &mut watch; while let Some(ref mut node) = pre.next { if node.val == val { pre.next = node.next.take(); } else { pre = pre.next.as_mut().unwrap(); } } watch.next }}

转载地址:http://fuuci.baihongyu.com/

你可能感兴趣的文章
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>