代码随想录笔记——链表1

题目:移除链表元素

代码随想录链接:代码随想录 (programmercarl.com)

方法一:考虑两种情况

1、非头结点的删除: 当前指针直接指向下下一个节点

      ​​​​​​​

2、头节点的删除:头结点向后移动一位 

注意:C++要删除原来的节点释放内存

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //一个链表为什么有这么多头结点?理解:只有一个头结点,如果它被删掉了下一个就是头结点
        // 删除头结点
        while(head != NULL && head->val == val){
            ListNode* now=head;
            head=head->next;
            delete now;
        }
        ListNode* cur = head;
        // 删除非头结点
        while(cur != NULL && cur->next != NULL){
            if(cur->next->val == val){
                ListNode* now=cur->next;
                cur->next = cur->next->next;
                delete now;
            }else{
                cur = cur->next;
            }
        }
        return head;
    }
};

cur和head指向的是同一个内存地址,当cur发生变化时,head对应地址里的东西也会变化,所以可以直接返回head。 

方法2:使用虚拟头结点(dummy node),也就是在原来的头结点前添加一个头结点

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 设置一个虚拟头结点
        ListNode* dummynode = new ListNode(0); 
        // 指向head
        dummynode->next = head;
        ListNode* cur = dummynode;
        // while(cur != NULL && cur->next !=NULL){  //这里不用判断自己是否空,因为dummynode是我们自己定义的,可以确定不为空
        while(cur->next != NULL){
            if(cur->next->val == val){
                ListNode* temp = cur->next; 
                cur->next = cur->next->next;
                delete temp;
            }
            else{
                cur = cur->next;
            }
        }
        head = dummynode->next;
        delete dummynode;
        return head;
    }
};

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值