203. 移除链表元素(Java/C)

LeetCode-链表1

203. 移除链表元素

方法一:通过哨兵节点作为中间,不断遍历筛选

Java:

image-20230914110847588

 public ListNode removeElements(int value) {
        //如果为空链表,返回null
        if (head == null) return head;
        //如果链表不为空,创建哨兵节点
        ListNode sentinel = new ListNode(666, head);
        head = sentinel;
        //遍历节点,直到链表为空时,不存在节点
        ListNode p = head;
        while (p.next != null){
            if (p.next.val == value){
                //判断是否为最后一个节点
                if (p.next.next != null){
                    p.next = p.next.next;
                } else {
                    p.next = null;
                }
            } else {
                //从新判断
                p = p.next;
            }
        }
        return head.next;
    }

C:

struct ListNode* removeElements(struct ListNode* head, int value) {
    if (head == NULL) return head;

    struct ListNode sentinel;
    sentinel.val = 666;
    sentinel.next = head;
    head = &sentinel;
   
    struct ListNode* p = head;
    while (p->next != NULL){
        if (p->next->val == value){
            if (p->next->next != NULL){
                p->next = p->next->next;
            } else {
                p->next = NULL;
            }
        } else {
            p = p->next;
        }
    }
    return head->next;
}

测试用例

 @Test
    public void text1(){
        RemoveElements removeElements = new RemoveElements();
        removeElements.addLast(1);
        removeElements.addLast(2);
        removeElements.addLast(6);
        removeElements.addLast(3);
        removeElements.addLast(4);
        removeElements.addLast(5);
        removeElements.addLast(6);

        removeElements.removeElements(6);
        for (Integer value:removeElements) {
            System.out.println(value);
        }
    }

方法二:

public ListNode removeElements(ListNode head, int val) {
    while (head != null && head.val == val) {
        head = head.next;
    }
    // 已经为null,提前退出
    if (head == null) {
        return head;
    }
    // 已确定当前head.val != val

    ListNode pre = head;
    ListNode cur = head.next;
    while (cur != null) {
        if (cur.val == val) {
            pre.next = cur.next; // 删除当前节点
        } else {
            pre = cur; // 保持pre为当前节点的前一个节点
        }
        cur = cur.next; // 继续遍历下一个节点
    }
    return head; // 返回处理完成的链表
}

通过遍历链表,删除值为val的节点,返回处理结果(链表头节点)。其中,首先在while循环中,不断移动head指针,直到找到第一个值不等于val的节点或链表为空。然后,利用pre指针和cur指针配合遍历链表,当遇到值等于val的节点时,通过修正指针的引用关系进行节点删除操作,否则,继续遍历下一个节点。最后,返回处理完成的链表头节点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值