代码随想录算法训练营第三天|第二章 链表part01

本文介绍了链表这种数据结构,包括其定义(通过指针连接的数据结构)、操作方法如添加和删除节点,以及具体实例如移除链表元素、设计链表和反转链表的过程。
摘要由CSDN通过智能技术生成

遇到了一种新的数据结构---链表

链表:通过指针串联在一起的线性结构,由数据域和指针域组成;通过指针进行临近元素的查找工作(这也是进行基本数据处理的核心)

链表的定义,在此需要对数据结构的定义进行了解了:

strct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {} 
};

操作: 添加和删除节点都是需要对指针进行操作.

开始做题!!!

 203.移除链表元素  :移除链表元素

思考:

1.对该链表进行遍历操作,删除等于给定值的元素;

2.通过对指针的操作完成删除目标;

3.头节点怎么办? ------->为头节点再加一个头结点.

        ListNode* vitualHead = new ListNode(0);
        vitualHead->next = head ;
        ListNode* cur = vitualHead;
        
        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 = vitualHead->next;
        delete vitualHead;
        return head;

 707.设计链表:设计链表

思考:

1.这道题比较繁复,只能一个个类函数去分析,队友给定条件进行判断,或删除,或增加;

class MyLinkedList {
public:
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val), next(nullptr) {}
    };
    MyLinkedList() { //初始化MyLinkedList对象
        _dummyHead = new LinkedNode(0);
        _size = 0;
    }

    int get(int index) {
        if(index >(_size - 1) || index < 0) {
            return -1;
        }
        LinkedNode* cur = _dummyHead->next;
        while(index--) {
            cur = cur->next;
        }
        return cur->val;
    }

    void addAtHead(int val) {
        LinkedNode* addHead= new LinkedNode(val);
        addHead->next = _dummyHead->next;
        _dummyHead->next = addHead;
        _size++;
    }

    void addAtTail(int val) {
        LinkedNode* tailHead = new LinkedNode(val);
        LinkedNode* cur = _dummyHead;
        while(cur->next != nullptr) {
            cur = cur->next;
        }
        cur->next = tailHead;
        _size++;
    }

    void addAtIndex(int index, int val) {
        if(index > _size) return;
        if(index < 0) return;
        LinkedNode* addIndexHead = new LinkedNode(val);
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur->next;
        }
        addIndexHead->next = cur->next;
        cur->next = addIndexHead;
        _size++;

    }

    void deleteAtIndex(int index) {
        if(index >= _size) return;
        if(index < 0) return;
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur->next;
        } 
        LinkedNode* temp = cur->next;
        cur->next = cur->next->next;
        delete temp;
        _size--;    
    }

private:
    int _size;
    LinkedNode* _dummyHead;
};

 206.反转链表 :反转链表

思考:仍然需要双指针,一个指针用来指示断开原链接时,下一个的位置,一个用来指示建立新链接时,需要指向的位置.

 ListNode* temp; // 保存cur的下一个节点
        ListNode* cur = head;  //用来指向原来的链接
        ListNode* pre = NULL;  //需要被新节点指向
        while(cur) {
            temp = cur->next;  // 保存一下 cur的下一个节点,因为接下来要改变cur->next
            cur->next = pre; // 翻转操作,pre被指向
            // 更新pre 和 cur指针
            pre = cur;    //更新pre的位置
            cur = temp;   //更新cur的位置
        }
        return pre;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值