Java经典面试题之删除链表中等于给定值 val 的所有节点

题目描述都是这样的~
删除链表中等于给定值 val 的所有节点。

示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
要很好的完成这个题,首先我们考虑时间复杂度为O(n),空间复杂度为O(1),这才是面试官想看到的,也是我们要努力做到的。
我先简单的画了个图:
在这里插入图片描述val表示链表中的值,一般习惯用data表示,但是由于咱们这个题目中给定了val,就用这个看着更方便一些;next表示地址的引用;head是链表头节点的位置;prev和cur都是我们设定的初值。下面来看看在在线OJ下的代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
          if(head == null)  return null;
         ListNode prev = head;
         ListNode cur = head.next;
        while (cur != null) {
            if (cur.val == val) {
                prev.next = cur. next;
                cur = cur.next;
            } else {
                prev = cur;
                cur = cur.next;
            }
         }
         if (head.val == val) {
             head = head.next;
        }
        return head;
    }
}

前面的都是系统给的,自己主要写框架的中心部分。设定prev的值在head处,cur的值在head。next处,也就是图片上的位置。
在这里插入图片描述

1.首先要先判断链表是不是为空,如果为空就不需要删除,直接返回空,程序结束;
2.如果不为空,则进入while循环,在cur值为空时(即链表结束时)跳出循环,在没有跳出循环时,先判断cur.val的值与val的值是否相等,如果相等,则找到了第一个需要删除的数,令pevr.next = cur.next, cur=cur.next,第一个元素就被删除了。如图所示:
在这里插入图片描述

  1. 如果cur.val != val,则prev和cur继续向后寻找,即prev= cur,cur = cur.next;直到循环退出,就删除了除第一个元素以外的所有需要删除的值。
  2. 走到这儿,看似结束了,但是如果第一个元素也是需要删除的值,我们就漏掉了。那么怎么删除第一个元素呢?这儿我们用if判断,如果head.val = val,就把head的位置向后移就好,即head.next.

此时这个删除链表中等于给定值val的程序才算真正完成,要注意一点,while循环结束后再判断第一个元素是否需要删除,因为此时的第二个元素是肯定不需要删除的,这个if一定要写在while循环外面,等while循环结束后才能判断。且,一定要有返回值,返回val的值!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值