【刷题DAY3】链表|203.移除链表元素 707.设计链表 206.反转链表

2,049 阅读1分钟

203.移除链表元素

ListNode* removeElements(ListNode* head, int val) {
        // 问题 第一个元素就是怎么办
        while(head && head->val == val){
            head = head->next;
        }
        if(!head){
            return head;
        }
        ListNode* slow = head;
        ListNode* fast = head->next;

        while(fast){
            if(fast->val == val){
                slow->next = fast->next;
                fast = fast->next;
            }else{
                slow = slow->next;
                fast=fast->next;
            }
        }

        return head;
    }

206. 反转链表

ListNode* reverseList(ListNode* head) {
        if(!head){
            return head;
        }
        // 反转链表,要记住下一个的下一个
        ListNode* pCurr=head;
        // 注意不要访问空指针
        ListNode* pNext=head->next;
        pCurr->next = nullptr;
        while(pNext){
            ListNode* tmp = pCurr;
            pCurr = pNext;
            pNext = pNext->next;
            pCurr->next = tmp;
        }
        return pCurr;
    }

707. 设计链表

待优化


struct Node{
    int val;
    Node* next;

    Node():val(0), next(nullptr){};
    Node(int x): val(x), next(nullptr){};
    Node(int x, Node* next): val(x), next(next){};
};

class MyLinkedList {
public:
    MyLinkedList() {
        head = nullptr;
        len = 0;
    }
    
    int get(int index) {
        if(index > len-1){
            return -1;
        }
        Node* tmp= head;
        while(index){
            tmp = tmp->next;
            --index;
        }
        return tmp->val;
    }
    
    void addAtHead(int val) {
        Node* newp = new Node(val, head);
        if(head){
            head->next = newp;
        }else{
            head = newp;
        }
        ++len;
    }
    
    void addAtTail(int val) {
        Node* newp = new Node(val);
        if(head){
            Node* tmp = head;
            while(tmp->next){
                tmp = tmp->next;
            }
            tmp->next = newp;
        }else{
            head = newp;
        }
        ++len;
        
    }
    
    void addAtIndex(int index, int val) {
        if(index > len){
            return ;
        }
        Node* newp = new Node(val);
        Node* tmp= head;
        while(index-1>0){
            tmp = tmp->next;
            --index;
        }
        newp->next = tmp->next;
        tmp->next = newp;
        ++len;
    }
    
    void deleteAtIndex(int index) {
        if(index > len-1){
            return ;
        }
        Node* tmp= head;
        while(index-1>0){
            tmp = tmp->next;
            --index;
        }
        tmp->next = tmp->next ? tmp->next->next: nullptr;
        --len;
    }

private:
    Node* head;
    int len;
};