(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)

相关推荐
明道源码1 小时前
Kotlin Multiplatform 跨平台方案解析以及热门框架对比
开发语言·kotlin·cocoa
fie88891 小时前
C#实现连续语音转文字
开发语言·c#
一念&3 小时前
每日一个C语言知识:C 头文件
c语言·开发语言·算法
DARLING Zero two♡4 小时前
仓颉GC调优参数:垃圾回收的精密控制艺术
开发语言·仓颉
今日说"法"4 小时前
Rust探秘:所有权转移在函数调用中的表现
开发语言·后端·rust
java1234_小锋4 小时前
PyTorch2 Python深度学习 - 自动微分(Autograd)与梯度优化
开发语言·python·深度学习·pytorch2
Python私教5 小时前
C 语言运算符全景:从入门到进阶
c语言·开发语言·网络
csbysj20206 小时前
Perl 格式化输出
开发语言
tao3556676 小时前
【Python刷力扣hot100】42. Trapping Rain Water
开发语言·python·leetcode
消失的旧时光-19437 小时前
Kotlin 协程最佳实践:用 CoroutineScope + SupervisorJob 替代 Timer,实现优雅周期任务调度
android·开发语言·kotlin