力扣刷题——单链表系列——第一题:移除链表元素,从此链表初窥门径,神挡杀神~
题目链接:力扣
力扣刷题——————>单链表系列
第一种解法:在原链表上进行操作,小红日烧脑版
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/class Solution{public ListNode removeElements(ListNode head, int val){if(head== null) return head;ListNode cur=head;ListNode ahead=null;while(cur != null){if(cur.next != null)//首先当前的下一个不为空{ahead = cur.next;//调用先驱节点往前走,此句话保证了ahead一直在cur后面一位,紧跟着新curif(ahead.val == val)//如果先驱节点的值正好等于目标值{cur.next=ahead.next;//跨过ahead节点连接ahead = cur;//先驱节点退回,等待下一次使用。}}if(cur.next != null && cur.next.val != val){cur = cur.next;//cur能向前移动ahead = ahead.next;}if(cur.next == null){if(head.val == val) return head.next;else break;}}return head;}}
关于本题解,补充说明如下,
//首先其实本题我的解法循环不变量设置的有问题,很多情况下不论是数组还是链表
//快慢指针也好,滑动窗口也罢,其实极大多数都是将走的快的指针 一探到底设置为终止条件的
//循环不变量设置为cur,我的上述都是在while循环内针对cur.next不为空进行的操作,也就是最后cur.next==null的时候循环出不去了,所以需要进行处理!
//只有cur的下一个节点的值不为目标值,才能移动cur,所以到了此步(cur.next==null),不用再检查cur的val了
//拐回去判断一下头节点即可!~~,因为一开始就是从cur和cur.next起始的,正好错过第一个头结点记得要在内部返回,不然报错死循环!也就是说你循环不变量找错了,需要手动退出~太菜了
//所以推荐大家用移动的快的指针做循环不变量终止循环!
根据本题,总结经验:
1:从一开始如果第一个头结点后是一连串符合要求需要删去的,那么要求你要么不断将指针回退,避免连续符合要求的情况,但是指针不断前进漏过去了:
要么跳过第一个头结点,扫描一遍再回头看第二个
2:while循环还是要找对循环不变量条件,出去的条件要考虑到
很多情况下不论是数组还是链表
//快慢指针也好,滑动窗口也罢,其实极大多数都是将走的快的指针 一探到底设置为终止条件的
找对条件事半功倍
3: 其次,如果起手一连串相同的,不如先考虑从第二个开始,然后再回头检查第一个,这种思想真的不错。
力扣刷题——————>单链表系列
第一题:移除链表元素
第二种解法:在原链表上进行操作,博哥版
此题某种意义上可以写成 单链表内的增删查改中的删除方法,remove属实高效。
更改了循环不变量!
/*** Definition for singly-linked list.* <p>* public class ListNode {* <p>* int val;* <p>* ListNode next;* <p>* ListNode() {}* <p>* ListNode(int val) { this.val = val; }* <p>* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* <p>* }*/class Solution {//博哥解法public ListNode removeElements(ListNode head, int val) {if (head == null) return head;//只有在此判断是不是链表上来就为空,反手一个空,下面的引用变量就爆炸了,无法声明ListNode cur = head;//起手把用来穿的固定节点定在第一个ListNode ahead = head.next;//把先驱节点定在第二个//到时候回头来检查第一个节点//如果是 66666 val==6这种极端特判,从第一个开始检查太费劲,先驱结点需要不断退回~while (ahead != null)//此处用ahead先驱节点做循环不变量,好处有三//1:下面循环内的两种情况,不管何种,ahead的位置都在不断变更向前,当ahead为空,链表扫描一遍,复杂度为n//2:如果是只有一个节点的情况,ahead就是空,进不去循环。{if (ahead.val == val)//如果先驱节点的值就是目标值,先跳过这个结点,然后再跟固定的穿起来{ahead = ahead.next;cur.next = ahead;} else//先驱节点安全,先往前再说,新ahead的值下次循环再判{cur = cur.next;ahead = ahead.next;}}//出了循环,然后再判断头结点if (head.val == val) {return head.next;}return head;}}
第三种解法:论 链表的暴力解法!及其容易出现和发生的bug
-
力扣刷题——单链表系列——第一题:移除链表元素,从此链表初窥门径,神挡杀神~相关推荐
- 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!
开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...
- 力扣刷题之二叉树的层序遍历
Welcome to you, 每日一刷系列 二叉树的层序遍历 二叉树的层序遍历II 二叉树的右视图 ...
- 力扣刷题记录--哈希表相关题目
当遇到需要快速判断一个元素是否出现在集合里面的时候,可以考虑哈希法,牺牲一定的空间换取查找的时间. java常用的哈希表有HashMap.HashSet以及用数组去模拟哈希,这几种方法各有优劣. 数组 ...
- 《剑指Offer》力扣刷题笔记(03-10)
<剑指Offer>力扣刷题笔记(03-10) 最近确实有点闲,想在进组搬砖之前找点有意义的事干,于是,就开始刷<剑指Offer>.<程序员面试金典>等书上的题目,也 ...
- 『力扣刷题』5275_找出井字棋的获胜者 解题代码
LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5275_找出井字棋的获胜者 * 5275. 找出井字棋的获胜者 显示英文描述* 用户通过次数0* 用户尝试次数0* ...
- 力扣刷题记录-单调栈相关题目
单调栈是指栈里的元素保持升序或者降序. 判别是否需要使用单调栈:通常是一维数组里面,需要寻找一个元素左边或者右边第一个比自己大或者小的元素的位置,则可以考虑使用单调栈:这样的时间复杂度一般为O(n). ...
- 力扣刷题记录-动态规划问题总结
百度百科里对于动态规划问题是这样解释的: 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.因此各个阶段 ...
- 力扣刷题之合并两个有序数组
力扣刷题之合并两个有序数组 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目. 请你 合并 nu ...
- 力扣刷题——双数之和
很多人去力扣刷题都是数组的第一题,也就是双数之和,相信这也是很多人劝退题目,甚至对自己学过的知识产生了怀疑,这真的是我学完C语言,Java,Python或C++之后能做出来的题目吗?直接劝退了很多人, ...
最新文章
- Python开发工程师必知十大机器学习库
- c程序设计语言第五单元,(C语言程序设计基础课件)第五单元循环结构程序设计.pptx...
- 关于node.js的web框架的应用及并发性能测试
- jquery实现加载更多效果
- 客户端产生CLOSE WAIT状态的解决方案
- CVPR 2020 Oral | 旷视研究院提出双边分支网络BBN:攻坚长尾分布的现实世界任务...
- WP7基础学习---第九讲
- SRM 542 DIV2
- J-Link RTT Viewer 的各种不爽以及解决方案
- 手机端电子签名画板js插件
- 十大编程语言的优劣对比简述
- Word2010下划线不显示
- Excel二维码图片生成器
- 6本豆瓣高分书,国内外的技术大牛都在看!
- 苏黎世大学计算机研究生费用,苏黎世联邦理工学院学费需要多少
- sql判断字段是否以某个子串开头,结尾
- 轻松学习JavaScript十一:JavaScript基本类型(包含类型转换)和引用类型
- 编写程序,输入一个3位整数,反转后输出。
- navicat 表合并查询_MySQL数据表合并去重的简单实现方法
- 常用的计算机技术检索有哪几种,在计算机检索中,常用的布尔逻辑算符有哪几种?试用A和B的逻辑表达式说明其检索结果。...
热门文章
- 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!