代码随想录算法训练营---第三天

今天同样是三道题

第一题 

代码随想录算法训练营---第三天_第1张图片

我的思路 

   两个指针前指针和后指针,同时向后遍历,当后指针所指项等于val时消除后指针所指项,此题思路不难,但要注意题目中的特殊情况。例如数组的第一项为val;数组为空;后来看题解时,题解用虚拟头节点去解决了数组第一项为val的情况

代码随想录算法训练营---第三天_第2张图片

代码随想录算法训练营---第三天_第3张图片

题解解法

代码随想录算法训练营---第三天_第4张图片

第二题 :

代码随想录算法训练营---第三天_第5张图片

我的思路:

这道题不算难,但是我真的写了好久,感觉可以但就是不对,在细节方面的处理有点差,所以,导致写了很久,整体思路就是写链表的思路,只不过按照题中的要求去做。

class Node{
public:
   Node(){
       val =INT32_MAX;
       next =nullptr;
   }
    Node(int val1){
       val =val1;
       next =nullptr;
   }
    Node(Node* val1){
       val =val1->val;
       next =val1->next;
   }
   int val;
   Node* next;
};

class MyLinkedList {
public:
    MyLinkedList() {
        head = new Node();
        size =0;
    }
    
    int get(int index) {
        if(head == nullptr){
            return -1;
        }
        Node* newnode= new Node(head);
        cout<next;
            }
        }
        return newnode->val;
    }
    
    void addAtHead(int val) {
        if(head->val ==INT32_MAX && head->next ==nullptr){
             head->val =val;
        }else{
            Node* node1 = new Node(head);
            Node* node = new Node(val);
            node->next = node1;
            head->val =node->val;
            head->next =node->next;
        }
        size++;
    }
    
    void addAtTail(int val) {
        if(head->val ==INT32_MAX && head->next ==nullptr){
             head->val =val;
        }else{
           Node* node = new Node(val);
            Node* firstnode =head;
            while (1) {
                if (firstnode->next == nullptr)break;
                firstnode = firstnode->next;
            }
            firstnode->next = node;
        }
        size++;
    }
    
    void addAtIndex(int index, int val) {
        if(index>size){
        }else if(index == 0){
             addAtHead(val);
        }else if(index == size){
            addAtTail(val);
        }else {
           Node* firstnode = head;
            Node* secondnode =head->next;
            Node* newNode = new Node(val);
            for (int i = 1; i < index; i++) {
                firstnode = firstnode->next;
                secondnode = secondnode->next;
            }
            newNode->next = secondnode;
            firstnode->next = newNode;
            size++;
        }
    }
    
    void deleteAtIndex(int index) {
            if(index ==0){
                head = head->next;
                 size--;
            }else if(index > size-1){
            }else{
               Node* firstnode = head;
               Node* secondnode = head->next;
               for(int i=1;inext;
               secondnode = secondnode->next;
            }
            firstnode->next = secondnode->next;
            size--;
        }
           
    }
private:
   Node* head;
   int size;
};

第三题   :

 代码随想录算法训练营---第三天_第6张图片

     思路:

 双指针法:

 两个指针一前(cur)一后(pre),还有一个指针用于保存cur的下一个指针,因为cur->next的指针会改变所以需要提前保存,前(cur)指针和后(pre)指针不断向后遍历,去更改方向。

代码实现有两种方法:
  指针版

代码随想录算法训练营---第三天_第7张图片

  递归版

代码随想录算法训练营---第三天_第8张图片

两种版本 递归版代码更简洁,指针版更清晰。

总结:

第三天的感觉也还可以,目前还未感受到压力,可以接受。但是,发现自己对于细节的处理很差,可能平时生活中也不太注重细节。要改证下习惯了。下手写代码前一定要多想想特殊情况,代码思路,代码以什么形式去写。

你可能感兴趣的:(算法,数据结构)