链表OJ题——(力扣203)移除链表元素
(一)题目题目链接:203. 移除链表元素 - 力扣(LeetCode)
https://i-blog.csdnimg.cn/direct/997d1067f4aa400cb7786cf1169bd3ef.png
题目的要求一个是删除链表中全部满足Node.val == val的节点,一个是返回头节点。
(二)思路
链表中删除结点的方法很简单,就是让被删除元素前一个节点指向被删除元素的后一个节点,如果把前一个节点记为prev,当前要删除的节点记为cur,那么后一个节点就是cur.next。则删除操纵可以写为prev.next = cur.next。
https://i-blog.csdnimg.cn/direct/f85da8a96bf54ba39310e024612882cb.png
我们可以看到,链表中如果要删除一个元素,就是跳过这个节点去改变引用指向,但这里有一个问题:当必要访问一个节点的next属性时,起首要保证节点存在,否则就会触发空指针非常。因为cur在prev之前,以是我们在遍历链表进行查找时必要时候保证cur存在,即cur != null,满足这个条件后在开始删除操纵。
上面这个示例中,我们所必要删除的元素是在链表中间的,但也有非常环境:要删除的元素是链表的头节点且链表只有一个元素,这个时间链表的头节点设为prev时,cur在哪?cur为null,我们前面说过,进行删除操纵前起首要满足cur不为null,以是上述的方法我们是进入不了判断的,也就不能进行删除操纵了。针对这个环境,我们就要对头节点进行单独的删除的操纵了:让head直接指向null。
https://i-blog.csdnimg.cn/direct/3543bba385af4224af1e89aa8deab29d.png
当然也存在要删除头节点且链表不止一个元素的时间,这个时间我们必要让head指向head的下一个节点,即head = head.next。
https://i-blog.csdnimg.cn/direct/b39688915f2e4761acaabcd4a8ecfb3c.png
这两个头节点删除本质上都是head = head.next,以是我们可以归为一类来对待。
综上,删除操纵有两个版本:头节点删除(head = head.next)、非头节点删除(prev.next = cur.next)。在之后写链表的题目中,如果没有加入傀儡节点,很多环境下都要留意思量一下头结点、尾节点,能办理很多非常。
对于不消删除的元素,就使用(prev = cur;cur = cur.next)往后进行遍历。
https://i-blog.csdnimg.cn/direct/88afb44a49ed40039e1787b77606bfb5.png
对于必要删除的元素,就删除(prev.next = cur.next)之后再往后遍历(cur = prev.next),留意删除后一定要记得遍历,而且要看清晰往后移动时值怎么写。
https://i-blog.csdnimg.cn/direct/16d8cba6f83342b7aa2ad0315b67584f.png
(三)代码
思路及要留意的问题就是这些,接下来来写代码。
1.
判断头节点,这里有个问题:头节点只有一个,但是如果头节点删除后下一个新头节点还是要删除的值,那么就要不停删除,以是我们要用while循环不停到新头节点不是要删除的值后再进行非头节点的判断,而不是仅仅只使用if语句判断一次。
while(head != null && head.val == val){
head = head.next;
} 留意while语句中要判断head != null。上面代码结束后,我们就保证了头节点判断或删除完毕了。
2.
上面的while循环结束后,有两种可能:head = null或head的值不即是val了,head为空说明链表已经没有元素了,我们必要对head是否为空再次判断下。
//判断链表是否为空
if(head == null){
return null;
} 3.
到达这步后说明链表不为空,那么我们必要对后面非头结点的值进行判断。我们预备两个引用prev和cur,一个从head开始,一个从head.next开始,然后开始遍历、判断、删除。
ListNode prev = head;
ListNode cur = head.next;
while(cur != null){
if(cur.val != val){
prev = cur;
cur = cur.next;
}else{
prev.next = cur.next;
cur = prev.next;
}
} 4.
在末了别忘了返回头节点。
return head; 5.完整代码
while(head != null && head.val == val){
head = head.next;
} //判断链表是否为空
if(head == null){
return null;
} ListNode prev = head;
ListNode cur = head.next;
while(cur != null){
if(cur.val != val){
prev = cur;
cur = cur.next;
}else{
prev.next = cur.next;
cur = prev.next;
}
} return head; 6.提交结果
https://i-blog.csdnimg.cn/direct/30cf93a39eb24ec1aa9c7bc7280df904.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]