首页 > 其他分享 >链表

链表

时间:2023-04-30 21:25:13浏览次数:32  
标签:ListNode nullptr next 链表 tail size

手写双链表:

#include <iostream>

// 链表节点结构体
struct ListNode {
    int value;
    ListNode* prev;
    ListNode* next;

    ListNode(int v, ListNode* p = nullptr, ListNode* n = nullptr) : value(v), prev(p), next(n) {}
};

class LinkedList {
public:
    LinkedList() : head(nullptr), tail(nullptr), size(0) {}
    ~LinkedList() { clear(); }

    // 在链表末尾添加元素
    void push_back(int value) {
        if (size == 0) {
            head = tail = new ListNode(value);
        } else {
            tail->next = new ListNode(value, tail);
            tail = tail->next;
        }
        ++size;
    }

    // 删除链表末尾元素
    void pop_back() {
        if (size == 0) return;
        ListNode* temp = tail;
        if (size == 1) {
            head = tail = nullptr;
        } else {
            tail = tail->prev;
            tail->next = nullptr;
        }
        delete temp;
        --size;
    }

    // 清空链表
    void clear() {
        while (size > 0) {
            pop_back();
        }
    }

    // 获取链表长度
    int get_size() const { return size; }

    // 打印链表元素
    void print() const {
        ListNode* temp = head;
        while (temp) {
            std::cout << temp->value << " ";
            temp = temp->next;
        }
        std::cout << std::endl;
    }

private:
    ListNode* head;
    ListNode* tail;
    int size;
};

int main() {
    LinkedList list;
    list.push_back(1);
    list.push_back(2);
    list.push_back(3);
    list.push_back(4);
    list.push_back(5);

    std::cout << "List: ";
    list.print();
    std::cout << "Size: " << list.get_size() << std::endl;

    list.pop_back();
    std::cout << "List after pop_back: ";
    list.print();
    std::cout << "Size: " << list.get_size() << std::endl;

    return 0;
}

标签:ListNode,nullptr,next,链表,tail,size
From: https://www.cnblogs.com/hacker-dvd/p/17365777.html

相关文章

  • 【数据结构】链式型存储结构-双向链表
    1 前言只要大家坐过火车,对于双向链表的理解就相当简单。双向链表就是在单链表的基础之上,为每一个结点增加了它的前继结点,我们来看看。2 双向链表双向链表的定义如下:typedefstructDaulNode{ElemTypedata;structDaulNode*prior;//前驱结点structDa......
  • 【数据结构】链式型存储结构-循环单链表
    1 前言对于单链表,由于每个结点只存储了向后的指针,到了尾部标识就停止了向后链的操作。也就是说,按照这样的方式,只能索引后继结点不能索引前驱结点。这样一来,不从头结点出发,这样就无法访问到全部结点。为了解决这个问题,我们只需要将单链表的尾结点的指针由空指针改为指向头结点......
  • 【数据结构】链式型存储结构-静态链表
    1 前言地球人都知道C语言是个伟大的语言,它的魅力在于指针的灵活性,使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加灵活方便。(面向对象语言,比如java,可以使用对象引用机制间接地实现指针的某些功能)但是古人还是木有C语言丫,木有JAVA丫,只有原始的Basic,Fortran等......
  • 【数据结构】链式型存储结构-单链表
    1 前言线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置。比起顺序存储结构每个元素只需要存储一个位置就可以了。现在链式存储结构中,除了要存储数据信息外,还要存储它的后继元素的存储地址(指针)。也就是说......
  • c#-单链表
    namespaceMyLink;publicclassMyLinkedList{privateint_size{get;set;}publicclassMyTreeNode{publicintval{get;set;}publicMyTreeNodenext{get;set;}publicMyTreeNode(intval){this.val=val;......
  • 【Redis】Redis数据结构——链表
    【Redis】Redis数据结构——链表注意事项:本文第三点redis中操作列表的相关命令可参考博文:【Redis】Redis基础命令集详解_Etui۹(・༥・´)و̑̑的博客本文参考内容如下:1、Redis数据结构——链表-随心所于-2、《Redis设计与实现》(黄健宏·著)第3章链表本文仅供学习交流使用!1、Redi......
  • java设计单链表
    packagelinked;/***@date2023/4/2622:51*@description单链表*/publicclassSingleLinkedList{privateintsize=0;privateNodehead;privateNodetail;publicstaticclassNode{privateObjectdata;privateNodenext;......
  • 两个链表的第一个公共结点
    使用空间存储节点的解法classSolution{public:set<ListNode*>s;ListNode*findFirstCommonNode(ListNode*headA,ListNode*headB){for(autoi=headA;i;i=i->next)s.insert(i);for(autoi=headB;i;i=i->next)......
  • 环形链表
    题目:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 思路:1、判断是否有环定义两个指针,一快一慢,从头指针开始遍历,快指针不为空或者快指针的下一个结点不为空,则有环2、返回环的位置 找到快、慢指针相遇的点,根据公式x=(n-1)(z+y......
  • [leetcode]复制带随机指针的链表
    力扣链接思路一:遍历链表,将链表结点复制下来,控制随机指针,去找对应的第几个(相对位置)进行链接.思路二:以时间换空间,创建两个指针数组,分别存放两个链表中结点的地址,直接可以在指针数组中找到结点该方法比上面的方法更优,但是时间复杂度依旧很高,但是还是达不到O(N)思路三:1.拷......