代码随想录算法训练营第三天|203.移除链表元素,707.设计链表,206.反转链表

283 阅读2分钟

Day3

今天学习到了链表,第一题做得有点久,待会得复习一下链表相关的内容。 203.移除链表元素 题目链接:leetcode.cn/problems/re…

```ListNode* removeElements(ListNode* head, int val) {
    ListNode* dummyhead = new ListNode(0);//虚拟头节点
    dummyhead->next = head;
    ListNode* cur = dummyhead;//当前头节点
    
    while(cur->next != NULL) {//遍历链表,依次寻找和val值相等的节点,找到则删除,
        if(cur->next->val ==val) {
            ListNode* tmp = cur->next;
            cur->next = cur->next->next;
            delete tmp;
        } else {
            cur = cur->next;
        }
        
        
    }
    head = dummyhead->next;
    delete dummyhead;
    return head;
    

}

707.设计链表 题目链接:707. 设计链表 - 力扣(LeetCode) 这题主要是熟悉对链表的操作。 代码如下: `` class MyLinkedList { public: //定义链表节点结构体 struct LinkedNode { int val; LinkedNode* next; LinkedNode(int val):val(val), next(nullptr){} }; //初始化链表 MyLinkedList() { dummyHead = new LinkedNode(0); //定义虚拟头节点,方便后续统一操作 size = 0; }

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

void addAtHead(int val) {
    LinkedNode* newNode = new LinkedNode(val);
    newNode->next = dummyHead->next;
    dummyHead->next = newNode;
    size++;
}

void addAtTail(int val) {
    LinkedNode* newNode = new LinkedNode(val);
    LinkedNode* cur = dummyHead;
    while(cur->next != NULL) {
        cur = cur->next;
    }
    cur->next = newNode;
    size++;
}

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

void deleteAtIndex(int index) {
    if(index < 0 || index >= size) {
        return;
    }
    LinkedNode* cur = dummyHead;
    while(index--) {
        cur= cur->next;
        
    }
    LinkedNode* tmp = cur->next;
    cur->next = cur->next->next;
    delete tmp;
    size--;

}

private: int size; LinkedNode* dummyHead; };

206.反转链表 题目链接:206. 反转链表 - 力扣(LeetCode) 这题第一眼还以为是要新开一个链表,仔细想想这也不是数组呀,这工作量太大了肯定不是最优解。原来只需要把指针反转就可以了,总体难度不难。 代码如下:

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

    }
};
`