(C++链表01) 移除链表元素

203、移除链表元素

不带头节点

cpp 复制代码
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while(head != NULL && head->val == val) {
            ListNode* tem = head;
            head = head->next;
            delete tem;
        }
        ListNode* cur = head;
        while(cur != NULL && cur->next != NULL) {
            if(cur->next->val == val) {
                ListNode* tem = cur->next;
                cur->next = tem -> next;
                delete tem;
            }else {
                cur = cur->next; 
            }
        }
        return head;
    }
};

时间复杂度:O(n)

空间复杂度:O(1)

带头节点

cpp 复制代码
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummy = new ListNode(0);
        dummy -> next = head;
        ListNode* cur = dummy;
        while(cur->next != NULL) {
            if(cur->next->val == val) {
                ListNode* tem = cur->next;
                cur->next = tem -> next;
                delete tem;
            }else {
                cur = cur->next; 
            }
        }
        return dummy->next;
    }
};

时间复杂度:O(n)

空间复杂度:O(1)

707、设计链表

注意链表结点的初始化、访问区间合不合法

cpp 复制代码
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 <= -1 || index >= size) {
            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) {
        if(index <= -1 || index > size) {
            return;
        }
        size++;
        if(index == size) {
            addAtTail(val);
            return;
        }
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = dummyHead;
        while(index--) {
            cur = cur->next;
        }
        newNode->next = cur->next;
        cur->next = newNode;
    }
    
    void deleteAtIndex(int index) {
        if(index <= -1 || index >= size) {
            return ;
        }
        LinkedNode* cur = dummyHead;
        while(index--) {
            cur = cur->next;
        }
        LinkedNode* tem = cur->next;
        cur->next = tem->next;
        delete tem;
        size--;
    }
    private: 
        LinkedNode* dummyHead;
        int size;
};

206、反转链表

双指针:

用cur指针遍历旧链表,head指针指向新链表的第一个结点,用tem指针取出遍历到的结点,将其指向head作为新链表的第一个节点,更新head。

cpp 复制代码
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;
        head = NULL;
        ListNode* tem = NULL;
        while(cur != NULL) {
            tem = cur;
            cur = cur->next;
            tem-> next = head;
            head = tem;
        }
        return head;
    }
};

时间复杂度:O(n)

空间复杂度:O(1)

相关推荐
syagain_zsx4 分钟前
BRpc 二次封装:Channel 管理、服务管理与回调工厂
c++·学习·程序人生·rpc·谷歌
cspttty15 分钟前
2027风险管理岗准备路线:数学与应用数学如何补齐金融、SQL与Python
开发语言·python·金融
我命由我1234520 分钟前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
严谨的麻辣烫1 小时前
Python HTTP 连接池怎么用?从连接复用到请求异常排查
开发语言·python·http·requests·网络排查
码林鼠1 小时前
flutter状态管理入门教程-Riverpod
开发语言·javascript·flutter
fpcc1 小时前
计算机原理—如何高效的操作文件
c++·计算机原理
Rabitebla1 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
system_error_x1 小时前
C++ 编程基础入门教程
开发语言·c++
Amos_Web2 小时前
Markdonw语法
开发语言·前端·javascript
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 回顾和今日内容介绍
java·开发语言·交友