Leetcode 203. Remove Linked List Elements

Remove all elements from a linked list of integers that have value val.

Example
Given: 1 –> 2 –> 6 –> 3 –> 4 –> 5 –> 6, val = 6
Return: 1 –> 2 –> 3 –> 4 –> 5

s思路:
1. 操作链表,要删除数。首先想想链表的边界是什么?左边是头节点,是边界,右边是为节点也是边界。如果要删除的节点恰好是头节点,就要考虑头指针改变的问题。因此用dummy或pointer-to-pointer。
2. 用dummy:首先需要新建一个node,赋初值为0,然后需要一个dummy指针指向这个node。
3. 用pointer-to-pointer: 之前总结过指向指针的指针的两种操作:第一种是只移动指向指针的指针到新的位置,这个操作相当于站位,放到需要的地方,不对链表产生改变;第二种操作是修改被指针指向的指针里的地址,让指针指向新的节点,这个操作会修改链表结构!
这里写图片描述
以上,operation 1表示移动pointer-to-pointer指向不同节点的指针域,operation 2表示修改节点的指针域,让指向新的node。这里最大的不同是,指针是低层次的,指向指针的指针是高层次的,更灵活,两者不是一个级别的事物!如果链表操作中同时需要这两个操作,就应该考虑用pointer-to-pointer

//方法1:dummy节点
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //
        ListNode node(0);
        ListNode* dummy=&node;
        dummy->next=head;
        head=dummy;
        while(head->next){
            if(head->next->val==val){
                head->next=head->next->next;    
            }else
                head=head->next;     
        }
        return node.next;
    }
};


//方法1.1:dummy节点,下面也行。但是需要delete dummy.不如上面方法来得快!
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //
        ListNode* dummy=new ListNode(0);
        dummy->next=head;
        head=dummy;
        while(head->next){
            if(head->next->val==val){
                head->next=head->next->next;    
            }else
                head=head->next;     
        }
        head=dummy->next;
        delete dummy;
        return head;
    }
};


//方法2:pointer-to-pointer
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //
        ListNode** pp=&head;

        while(*pp){
            if((*pp)->val==val){
                *pp=(*pp)->next;
            }else
                pp=&((*pp)->next);
        }
        return head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值