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

分析:

这个问题肯定是的有两个指针,一个指向当前所要检测的节点,另外一个是指向所检测节点之前的节点,这样子就可以直接修改指针,达到删除元素的效果。实际编程的时候有两个地方应该考虑到,就是如果起手第一个元素就是的,也就是所现在链表的第一个元素都要删除了,那么就要修改head指针,因为最后返回的是head指针。第二个就是如果删除掉一个元素之后,移动的只是当前检测的指针,而当前检测指针的前项指针是不用动的。

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode * p, *h;
        h = head;
        while(h){
            if(head->val == val){
                head = head -> next;//如果第一个元素就是要删除的,这个时候head指针是要修改的,因为最后返回的是head指针
            }
            else if(h->val ==val){
                p->next = h->next;//删除掉指定的元素
                h = h -> next;//将当前检测的指针向后移动一次,而当前检测元素的前项指针是不用动的
                continue;
            }
            //这两行是正常的指针过度,即如果元素不是要删除的元素的时候,指针移动的情况
            p = h;
            h = h -> next;
        }
        return head;
    }
};

所有的理解,代码注释里面写的也很清楚了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值