链表的总结

链表总结:

  • 链表的定义
  • 链表的分类
  • 链表的操作
  • 链表的性能
  • 相关题目的练习

链表的定义:

这个要自己多写,容易写错

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x),next(NULL);
}

单链表,双链表,循环链表


链表的操作:

链表的增加和删除操作的时间复杂度O(1),查找的时间复杂度是O(n).

1.使用虚拟头节点,生成一个新节点cur和dummyHead指向同一个节点
2.注意下标的判断,判断是否越界

注意添加和删除时index判断的区别,>size,>=size。

class MyLinkedList {

public:
    // 定义链表节点结构体
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int x) : val(x), next(nullptr) {}
    };

    // 初始化链表
    MyLinkedList() {
        _dummyHead = new LinkedNode(0);
        _size = 0;
    }

    // 获取下标为index的节点
    int get(int index) {
        if (index >= _size || index < 0)
            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 != nullptr) {
            cur = cur->next;
        }

        cur->next = newNode;
        _size++;
    }
    // 在下标为index的节点前添加节点
    void addAtIndex(int index, int val) {
        if (index > _size) // 这里要注意以下,那么size就是新插入的节点的位置
            return;
        if (index < 0)
            index = 0; //  如果index小于0,则在头部插入节点

        LinkedNode* newNode = new LinkedNode(val); // 创建新节点
        LinkedNode* cur = _dummyHead;              // 从头结点开始遍历

        while (index--) {
            cur = cur->next;
        }

        // 插入新节点
        newNode->next = cur->next; // 将 newNode 的 next 指向 cur 的下一个节点
        cur->next = newNode; // 将 cur 的 next 指向 newNode
        _size++;             // 增加链表大小
    }

    // 删除下标为index的节点
    void deleteAtIndex(int index) {
        if (index >= _size || index < 0) {
            return;
        }
        LinkedNode* cur = _dummyHead;
        while (index--) {
            cur = cur->next;
        }
        LinkedNode* tmp = cur->next;
        cur->next = cur->next->next;
        delete tmp;
        _size--;
    }

    // 打印链表
    void printLinkedList() {
        LinkedNode* cur = _dummyHead;
        while (cur->next != nullptr) {
            cout << cur->next->val << " ";
            cur = cur->next;
        }
        cout << endl;
    }
private:
    int _size;
    LinkedNode* _dummyHead;
};

相关题目:

  • 反转链表(面试高频考题)
  • 两两交换位置。
  • 删除倒数第n个节点
  • 链表相交
  • 环形链表

心得

第一遍刷算法题,感觉都是听懂了,但是还处于还不会写的阶段。希望坚持住进度,也要复习好学过的,不能一味的为了赶进度而赶进度,要高质量高效的进行学习。 戒懒,要自己真正的去敲,勤奋一点。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表是一种常用的数据结构,用于存储一系列元素。C语言中,链表是通过指针来实现的,每个节点包含数据和指向下一个节点的指针。 以下是链表的基础知识总结: 1. 链表的定义: ```c struct Node { int data; struct Node* next; }; ``` 其中,data 表示节点存储的数据,next 表示指向下一个节点的指针。 2. 链表的操作: - 创建节点: ```c struct Node* createNode(int data) { struct Node* node = (struct Node*) malloc(sizeof(struct Node)); node->data = data; node->next = NULL; return node; } ``` - 插入节点: ```c void insertNode(struct Node* head, int data) { struct Node* node = createNode(data); node->next = head->next; head->next = node; } ``` 其中,head 表示链表头节点。 - 删除节点: ```c void deleteNode(struct Node* head, int data) { struct Node* p = head->next; struct Node* q = head; while (p != NULL) { if (p->data == data) { q->next = p->next; free(p); break; } q = p; p = p->next; } } ``` - 遍历链表: ```c void traverseList(struct Node* head) { struct Node* p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } ``` - 销毁链表: ```c void destroyList(struct Node* head) { struct Node* p = head->next; while (p != NULL) { struct Node* q = p; p = p->next; free(q); } head->next = NULL; } ``` 3. 链表的优缺点: 链表的优点是插入和删除操作的时间复杂度为 O(1),而数组的时间复杂度为 O(n)。但是,链表的缺点是无法随机访问元素,需要遍历整个链表才能找到要查找的元素。此外,链表需要额外的空间来存储指向下一个节点的指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值