leedcode 算法学习记录 链表 移除元素

public class DeleteNde {

    public ListNode removeElements(ListNode head, int val) {
        //因为头结点的删除与其他节点不同,
        //其他节点删除只需要pre.next = cur.next 即可
        //但是头结点因为没有前一个节点 所以head= head.next
        //因此刚开始应该提前判断是否需要删除头结点,
        //需要注意的第一个头结点删除后.第二的节点变为头结点,仍需判断是否要删除头结点
        //所以这里使用一个while循环来删除头结点,直到头结点不为头结点为止
        //但是判断头结点的值前应该先判断是否为空,否则会报错,
        //因为如果对象为空则该对象相当于只是声明了,并没有赋值,所以它的属性并没有定义,所以访问会报错
        //下来使用循环遍历即可,当一个节点为null时.则遍历完毕,输出此时的头结点即可
        while (head != null && head.val == val) {
            head = head.next;
        }
        if (head == null) {
            return head;
        }
        ListNode pre = head;
        ListNode cur = head.next;
        while (cur != null) {
            if (cur.val == val) {
                pre.next = cur.next;
            } else pre = cur;
            cur = cur.next;
        }
        return head;
    }

    //版本二
    //上面版本中,因为头结点需要单独判断所以代码略显复杂,
    //这次换个思路,如果没有头结点的话不久不用单独判断了吗
    //解决方法,新建一个节点将这个节点放到最前面当成临时头结点,
    //这用链表就不用单独判断头结点了,因为现在的头结点是我们自己定义的,返回结构时我们返回的应该是现在头结点的下一位
    public ListNode removeElements1(ListNode head, int val) {
        ListNode newHead = new ListNode(0, head);
        ListNode pre = newHead;
        ListNode cur = newHead.next;
        while (cur != null) {
            if (cur.val == val) {
                pre.next = cur.next;
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
        return newHead.next;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值