203.移除链表元素

第一次尝试

  删除链表中等于给定值 val 的所有节点。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为 LeetCode 中写的代码)(LeetCode链接)

  • 方法一:由于首元结点和非首元结点的删除不一样,所以情况讨论,如果要删除首元结点,只需先保留当前节点,然后将 head 指向下一个节点,再释放当前节点即可;如果要删除的不是首元结点,那么每次都要保留要删除节点的上一个节点 node 和要删除元素的下一个节点 next,然后释放掉当前节点,再让 node 指向 next,直至结束即可;
  • 方法二:虚空大法,由于删除首元结点和非首元结点是不一样的,我们可以先创建一个虚首元结点,然后再把每个元素的删除当做非首元结点来看就行了,这样就可以将两种情况合二为一了,不过这样做的话,最终返回的就不是 head 了。而是 head -> next;
struct ListNode* removeElements(struct ListNode* head, int val){
    //对头结点的筛选
    while(head != NULL&&head->val == val){
        struct ListNode* node=head;
        //如果首节点等于val,那就将首指针向后移动,并释放首节点
        head = head->next;
        free(node);
    }
    //对非头结点的筛选
    struct ListNode* node = head;
    while(node != NULL&&node->next != NULL){
        if(node->next->val == val){
            struct ListNode* next = node->next;
            struct ListNode* nextnext = next->next;
            free(next);
            node->next = nextnext;
        }
        else{
            node=node->next;
        }
    }
    return head;
//方法二:虚空大法
    //创建一个虚节点,用来当做首元结点
    struct ListNode _head;
    //让虚首元结点指向现在的链表头结点,然后当做头结点
    _head.next = head;
    head = &_head;
    struct ListNode* node=head;
    //这样就可以将上面方法中的两种情况合二为一
    while(node != NULL&&node->next != NULL){
        if(node->next->val == val){
            struct ListNode* next = node->next;
            struct ListNode* nextnext = next->next;
            free(next);
            node->next = nextnext;
        }
        else{
            node=node->next;
        }
    }
    return head->next;
}

博客园发表于 2020-12-10 08:46

以下是移除链表元素的Python代码: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def removeElements(head: ListNode, val: int) -> ListNode: # 处理头部节点为要删除元素的情况 while head is not None and head.val == val: head = head.next # 处理链表中间节点为要删除元素的情况 if head is not None: node = head while node.next is not None: if node.next.val == val: node.next = node.next.next else: node = node.next return head ``` 这里定义了一个ListNode类表示链表节点,其中val表示节点的值,next表示指向下一个节点的指针。removeElements函数的第一个参数head表示链表的头节点,第二个参数val表示要删除元素值。函数的返回值是移除后的链表头节点。 函数的实现分为两步: 1. 处理头部节点为要删除元素的情况,即如果头部节点的值等于要删除元素值,则将头部节点指向下一个节点,直到头部节点的值不等于要删除元素值。 2. 处理链表中间节点为要删除元素的情况,即从头节点开始遍历链表,如果当前节点的下一个节点的值等于要删除元素值,则将当前节点的next指针指向下一个节点的next指针,即跳过当前节点的下一个节点;否则,将当前节点指向下一个节点。遍历完成后,返回链表的头节点。 注意,这里的实现并没有考虑链表为空的情况,需要在调用函数前进行判断。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值