代码随想录训练营day3 | 203.移除链表元素 707.设计链表206.反转链表

移除链表元素

代码随想录 (programmercarl.com)

classSolution{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;}};

设计链表

代码随想录 (programmercarl.com)

classMyLinkedList{public:// 定义链表节点结构体structLinkedNode{int val;
        LinkedNode* next;LinkedNode(int val):val(val),next(nullptr){}};// 初始化链表MyLinkedList(){
        _dummyHead =newLinkedNode(0);// 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
        _size =0;}// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点intget(int index){if(index >(_size -1)|| index <0){return-1;}
        LinkedNode* cur = _dummyHead->next;while(index--){// 如果--index 就会陷入死循环
            cur = cur->next;}return cur->val;}// 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点voidaddAtHead(int val){
        LinkedNode* newNode =newLinkedNode(val);
        newNode->next = _dummyHead->next;
        _dummyHead->next = newNode;
        _size++;}// 在链表最后面添加一个节点voidaddAtTail(int val){
        LinkedNode* newNode =newLinkedNode(val);
        LinkedNode* cur = _dummyHead;while(cur->next !=nullptr){
            cur = cur->next;}
        cur->next = newNode;
        _size++;}// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。// 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点// 如果index大于链表的长度,则返回空// 如果index小于0,则在头部插入节点voidaddAtIndex(int index,int val){if(index > _size)return;if(index <0) index =0;        
        LinkedNode* newNode =newLinkedNode(val);
        LinkedNode* cur = _dummyHead;while(index--){
            cur = cur->next;}
        newNode->next = cur->next;
        cur->next = newNode;
        _size++;}// 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的voiddeleteAtIndex(int index){if(index >= _size || index <0){return;}
        LinkedNode* cur = _dummyHead;while(index--){
            cur = cur ->next;}
        LinkedNode* tmp = cur->next;
        cur->next = cur->next->next;delete tmp;
        _size--;}// 打印链表voidprintLinkedList(){
        LinkedNode* cur = _dummyHead;while(cur->next !=nullptr){
            cout << cur->next->val <<" ";
            cur = cur->next;}
        cout << endl;}private:int _size;
    LinkedNode* _dummyHead;};

反转链表

代码随想录 (programmercarl.com)

classSolution{public:
    ListNode*reverseList(ListNode* head){
        ListNode* temp;// 保存cur的下一个节点
        ListNode* cur = head;
        ListNode* pre =NULL;while(cur){
            temp = cur->next;// 保存一下 cur的下一个节点,因为接下来要改变cur->next
            cur->next = pre;// 翻转操作// 更新pre 和 cur指针
            pre = cur;
            cur = temp;}return pre;}};

感受:

题目不难,但是注意细节,得多练习

这部分学起来比较吃力,还得再找点资料看看

明天继续加油

时长2h

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值