代码随想录day3

203.移除链表元素 

设置一个dummyhead,统一删除操作。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyhead=new ListNode(0);
        dummyhead->next=head;
        ListNode* cur=dummyhead;
        while(cur->next!=NULL){
            if(cur->next->val==val){//这里不用while,因为有个ifelse逻辑不相等的是不会移动的
                ListNode* temp=cur->next;
                cur->next=cur->next->next;
                delete temp;
            }else{
                cur=cur->next;
            }
        }
        return dummyhead->next;
    }
};

707.设计链表 

依然设置虚拟头结点统一操作。

class MyLinkedList {
public:
    struct linknode{
        int val;
        linknode* next;
        linknode(int val):val(val),next(nullptr){}//注意构造函数的形式
    };
    MyLinkedList() {//初始化链表
        _dummyhead=new linknode(0);
        _size=0;
    }
    
    int get(int index) {
        if(index<0||index>_size-1) return -1;
        linknode* cur=_dummyhead->next;
        while(index--){
            cur=cur->next;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        linknode* newnode=new linknode(val);
        newnode->next=_dummyhead->next;
        _dummyhead->next=newnode;
        _size++;
    }
    
    void addAtTail(int val) {
        linknode* newnode=new linknode(val);
        //linknode* cur=_dummyhead->next;有可能是一个空链表,那就会报溢出的错误
        linknode* cur=_dummyhead;
        while(cur->next!=NULL){
            cur=cur->next;
        }
        cur->next=newnode;
        _size++;
    }
    
    void addAtIndex(int index, int val) {
        if(index>_size) return;
        //只要添加节点就先new一个出来
        linknode* newnode=new linknode(val);
        linknode* cur=_dummyhead;
        while(index--){
            cur=cur->next;
        }
        newnode->next=cur->next;
        cur->next=newnode;
        _size++;
    }
    
    void deleteAtIndex(int index) {
        if(index>=_size) return;
        linknode* cur=_dummyhead;
        while(index--){
            cur=cur->next;
        }
        cur->next=cur->next->next;
        _size--;//把这个忘了
    }
private:
    int _size;
    linknode* _dummyhead;
};

这题的细节还是非常多的。

206.反转链表 

方法一:双指针。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* pre=NULL;
        ListNode* cur=head;
        while(cur){
            ListNode* temp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
        return pre;
    }
};

方法二:递归移动双指针。

class Solution {
public:
    ListNode* reverse(ListNode* pre,ListNode* cur){
        if(cur==NULL) return pre;
        //改变方向之前先记录一下之后的链表
        ListNode* temp=cur->next;
        //之后改变指向
        cur->next=pre;
        //之后递归移动双指针
        return reverse(cur,temp);//这一定要return一下,不然报错
    }
    ListNode* reverseList(ListNode* head) {
        return reverse(NULL,head);
    }
};

你可能感兴趣的:(链表,数据结构)