首页 > 其他分享 >链表发布会

链表发布会

时间:2023-11-05 14:33:04浏览次数:35  
标签:pre node head iterator nxt 发布会 链表 tail

链表可是个好东西, 那么我今天便拿出——自制链表!!!

666

它有着 精美丑陋的外观

class list 

简洁的语言

public:
		protected:
			int len;
			struct node {
				T v;
				node *pre, *nxt;
			} *head, *tail;

比stl更丰富 6!

void insert(int x, const T &v) {
			len++;
			node *q = new node(), *p = head;
			for (int i = 1; i <= x; i++) p = p->nxt;
			q->nxt = p->nxt; q->nxt->pre = q;
			p->nxt = q; q->v = v; q->pre = p;
		}

可谓是男人的加油站,女人的美容院我在说什么

好!

那么我便拿出他——自制链表

template<typename T>
    class List {
        public:
            protected://使外界不能访问 
                int len;
                struct node {
                    T v;
                    node *pre, *nxt;
                } *head, *tail;
        public:
            class iterator {
                friend List;//能使用node 

                public:
                    protected://修复BUG 6.3
                        node *q;
                public:
                    T operator * (){
                        return q->v;
                    }
                    bool operator != (const iterator &x) {//修复BUG 6.3 
                        if (this->q== x.q) {
                            return 0;
                        }
                        return 1;
                    }
                    iterator operator = (const iterator &x) { 
                        q = x.q;
                        return x;
                    }
                    iterator operator ++ () {
                        q = q->nxt;
                        iterator x;
                        x.q = q;
                        return x;
                    }
                    iterator operator ++ (int) {
                        q = q->nxt;
                        iterator x;
                        x.q = q;
                        return x;
                    }
            };
        public:
            friend iterator;//能使用q 

            iterator begin() {
                iterator x;
                x.q = head->nxt;
                return x;
            }

            iterator end() {
                iterator x;
                x.q = tail;
                return x;
            }

            List() {//7.21 添加 
            	len = 0;
                head = new node();
                tail = new node();
                head->nxt = tail;
                tail->pre = head;
			}

            void insert(int x, const T &v) {
                len++;
                node *q = new node(), *p = head;
                for (int i = 1; i <= x; i++) p = p->nxt;
                q->nxt = p->nxt; q->nxt->pre = q;
                p->nxt = q; q->v = v; q->pre = p;
            }

            int size() {
                return len;
            }

            void print(int l = 1, int le = -1) {//添加新功能 6.3,可不传参 
                iterator it;
                it.q = head;
                it++;//修复BUG 7.21 
                for (int i = 1; i <= l; i++) it++;//利用迭代器输出 
                if (le != -1) {
                    for (int i = 1; i <= le; i++) {
                        cout << *it << " ";
                        it++;
                    }
                    cout << "\n";
                }
                else {
                    for (int i = 1; i <= len && it.q->nxt != tail; i++) {
                        cout << *it << " ";
                        it++;
                    }
                    cout << *it;
                    cout << "\n";
                }
            }

            void erase(int x) {//O(n) 
                node *p = head;
                len--;
                for (int i = 1; i <= x; i++) p = p->nxt;
                p->pre->nxt = p->nxt;
                p->nxt->pre = p->pre;
                delete p;
            }

            void clear() {
                len = 0;
                node *h = head;
                while (h != tail) {
                    h = h->nxt;
                    delete head->pre;
                };
            }

            bool empty() {
                return len == 0;
            }

            void push_back(const T &v) {
                len++;
                node *p = new node();
                tail->pre->nxt = p;
                p->pre = tail->pre;
                p->v = v;
                tail->pre = p;
                p->nxt = tail;
            }

            void push_front(const T &v) {
                len++;
                node *p = new node();
                head->nxt->pre = p;
                p->nxt = head->nxt;
                p->v = v;
                head->nxt = p;
                p->pre = head;
            }

            void pop_front() {
                len--;
                node *p = head->nxt;
                head->nxt = p->nxt;
                p->nxt->pre = head;
                delete p;
            }

            void pop_back() {
                len--;
                node *p = tail->pre;
                p->pre->nxt = tail;
                tail->pre = p->nxt;
                delete p;
            }

            List operator = (List &l) {//添加等号6.3 
                clear();
                iterator it;
                for (it = l.begin(); it != l.end(); it++) {
                    push_back(*it);
                }
                return l;
            }
    };

食用方法:

	List<int> l;
	l.push_back(1);
	l.pop_back();
	l.insert(0, 4);//在第0后,添加4。
	l.erase(1);//删除第 1个
	l.push_back(1);
	l.push_back(2);
	List<int>::iterator it = l.begin();
	++it;
	l.print(1, 1);//输出 

标签:pre,node,head,iterator,nxt,发布会,链表,tail
From: https://www.cnblogs.com/luckycloud/p/17810490.html

相关文章

  • 数据结构之树(二叉树的存储方式之链表)
    JavaJava中可以使用链表来实现二叉树的存储。1.链表实现二叉树的原理:   链表是由节点组成的数据结构,每个节点包含一个数据和指向下一个节点的指针。  在链表中,可以将二叉树的每个节点都看作一个链表节点,同时维护一个指向左子节点的指针和一个指向右子节点的指针。通过......
  • 数据结构记录-链表
    1、单链表1、单链表的组成最基本的单链表组成如下:typedefstructLink{charelem;/*数据域*/structLink*next;/*指针域*/}link;/*节点名,每个阶段都是一个Link结构体*/为什么这样的就是链表呢,需要从这个结构体内部组成来看,structLinknext;定义了一个指针变......
  • 07_环形链表
    环形链表给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • 顺序表和链表
    writeup后面写258.链表去重给定一个键值为整数的单链表L,将键值的绝对值有重复的结点删除:即对任意键值K,只有键值或其绝对值等于K的第一个结点被保留在L中。例如,下面单链表L包含键值21、-15、15、7、-15,如下图(a)所示;去重后的链表L包含键值21、-15、7,如......
  • 数据结构之链表
    1.简介链表(LinkedList)是一种基本的数据结构,用于表示一组元素,这些元素按顺序排列,每个元素都与下一个元素连接。与数组不同,链表的元素不是在内存中连续存储的,而是通过指针来连接的。链表由节点(Node)组成,每个节点包含两个主要部分:数据和指向下一个节点(或上一个节点,如果是双向链表)的......
  • 精彩回顾!2023易知微秋季产品发布会亮点集结!
    易知微2023年秋季产品发布会已圆满收官!一起来回顾一下发布会的精彩亮点吧!一、智能普惠开放,让数字孪生成为生产力二、EasyTwin1.0:探索更易用的数字孪生新引擎1、从0.1到1.0,持续探索数字孪生融合渲染引擎有更优解:以成熟的3D编辑模式、便捷的交互蓝图、海量的模型资产以及灵活的业务......
  • Java面试题:链表-合并两个排序的链表
    描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。示例输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}原题地址:https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337代码实现packagecom.example.demo.linked;......
  • Java面试题:链表-反转链表
    问题描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。示例输入:{1,2,3}返回值:{3,2,1}原题地址:https://www.nowcoder.com/practice/7......
  • 发布会回放|Gradio 4.0 正式发布!
     Gradio的目标是使机器学习模型的演示更容易定制和访问,以满足不同用户的需求。在4.0正式版的发布活动上,HuggingFace的Gradio团队介绍了自己为了提高机器学习模型的可访问性所做的工作,以及如何创建自定义组件。Gradio是一个用于构建机器学习模型演示的工具,任何人都可以......
  • 寻找两个链表相交节点方法(可以是有环链表)
    问题分析:两个链表相交可以分为两个大类,一是两个无环链表相交,二是两个有环链表相交。 无环相交如图:有环相交有两种情况,一种是先相交后成环,如图:另一种是交点有两个,是成环后的交点(入环节点不同) 方法1.判断链表是否有环,返回第一个入环节点。2.判断是否相交3.......