203. 移除链表元素 、707.设计链表

203. 移除链表元素

题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

解答:对于非头节点和头节点分开进行考虑,头节点涉及到头指针的重新指向。删除时将上一节点指针指向此节点的下一个 即可。

代码实现:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode *p = head;
        while(p != NULL){
            //先进行头节点的删除
            if (head->val == val){
                p = p ->next;
                head = p;
            }
            //考虑非头节点
            else if (p->next != NULL && p->next->val == val){
                p->next = p->next->next;
            }
            else{
                p = p->next;
            }
        }
        return head;
    }
};

标准过程:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除头结点
        while (head != NULL && head->val == val) { // 注意这里不是if
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }

        // 删除非头结点
        ListNode* cur = head;
        while (cur != NULL && cur->next!= NULL) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
};

 707. 设计链表

题目描述:

 

解答:主要注意index从0开始,size是总数。对头结点进行操作需要单独考虑。

代码实现:

class MyLinkedList {
public:
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val), next(nullptr){}
    };
    MyLinkedList() {
        _dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
        _size = 0;
    }
    
    int get(int index) {
        int i = 0;
        if (index < 0 || index+1 > _size)
            return -1;
        LinkedNode *p =_dummyHead->next; 
        while(i < index){
            p = p->next;
            i++;
        }
        return p->val;
    }
    
    void addAtHead(int val) {
        LinkedNode *newHead = new LinkedNode(val);
        newHead->next = _dummyHead->next;
        _dummyHead->next = newHead;
        _size++;
    }
    
    void addAtTail(int val) {
        LinkedNode *p =_dummyHead->next; 
        LinkedNode *newTail = new LinkedNode(val);
        if (_size > 0){
            while(p->next != NULL){
                p = p->next;
            }
            p->next = newTail;
        }
        else{
            _dummyHead->next = newTail;
        }
        newTail->next = NULL;
        _size++;
    }
    
    void addAtIndex(int index, int val) {
        if (index <= 0){
            addAtHead(val);
            return;
        } 
        if (index == _size){
            addAtTail(val);
            return;
        }
        if(index > 0 && index < _size){
            int i = 0;
            LinkedNode *p = _dummyHead->next;
            while(i+1 < index){
                p = p->next;
                i++;
            }
            LinkedNode *newNode = new LinkedNode(val);
            newNode->next = p->next;
            p->next = newNode;
            _size++;
        }
    }
    
    void deleteAtIndex(int index) {
        if(index >=0 && index+1 <= _size){
            LinkedNode *p = _dummyHead->next;
            int i = 0;
            while(i+1 < index){
                p = p->next;
                i++;
            }
            //删除头结点的情况
            if(index == 1 || i != 0){
                p->next = p->next->next;
                _size--;
                return;
            }
            else{
                _dummyHead->next = p->next;
                _size--;
                return;
            }
        }
    }
private:
    int _size;
    LinkedNode* _dummyHead;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值