首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我将head设置为NULL时,在链表末尾添加元素不会抛出输出

当将head设置为NULL时,在链表末尾添加元素不会抛出输出的原因是,链表的头节点为空,表示链表为空链表。在这种情况下,如果要在链表末尾添加元素,需要进行特殊处理。

一种常见的处理方式是,当链表为空时,将新元素作为链表的头节点。具体步骤如下:

  1. 创建一个新节点,将新节点的值设置为要添加的元素。
  2. 检查链表是否为空,即判断头节点是否为空。
  3. 如果链表为空,将新节点设置为头节点。
  4. 如果链表不为空,遍历链表直到找到最后一个节点。
  5. 将最后一个节点的next指针指向新节点,将新节点作为链表的最后一个节点。

这样,就成功在链表末尾添加了新元素。

在腾讯云的云计算服务中,可以使用腾讯云的云数据库 TencentDB 来存储链表的数据。TencentDB 是一种高性能、可扩展的云数据库服务,支持多种数据库引擎,如 MySQL、Redis 等。您可以根据具体需求选择适合的数据库引擎来存储链表数据。

腾讯云 TencentDB 产品介绍链接地址:https://cloud.tencent.com/product/cdb

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

算法--链表相关套路

# # 示例: # # 输入: 1->2->3->4->5->NULL # 输出: 5->4->3->2->1->NULL # # 进阶: # 你可以迭代或递归地反转链表。...示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 解题思路:分离[m,n]的子链表,对子链表反转,然后分割放回去。...如果空间不是问题,最简单的方法是从头开始通过下一个字段探索节点,并将访问的节点存储哈希表中-仅当我们访问哈希表中已经存在的节点,存在一个循环。...如果不存在循环,则搜索结尾处结束(通常通过下一个字段设置null来表示)。 此解决方案需要O(n)空间,其中n是列表中的节点数。...(如果外部循环遇到列表的末尾,则不存在循环。)此方法的复杂度 ? 。 快慢指针 可以使这种想法在线性时间内工作-使用慢指针和快指针遍历列表。 每次迭代中,慢指针加1,快指针加2。

45620

ConcurrentLinkedQueue 源码解读

一、介绍 ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素,它会返回队列头部的元素...那么入队列的时候, tail 的 next 节点设置 newNode, newNode 设置 tail;出队列的时候, head 节点元素返回,head 的 next 节点设置 head。...想要读懂 ConcurrentLinkedQueue 的源码,最好先搞懂以下特质: 队列中任意时刻只有最后一个元素的 next null head 和 tail 不会null(哨兵节点的设计)...t : q; } } 队列中的元素不允许 null,否则抛出一个 NullPointerException q == null 说明 p 是队列中最后一个元素 CAS 设置 newNode...CAS 成功 item 设置 null,表明已经移除了元素(注意这个时候该元素还没有真正移出队列,p = p.next 的动作 updateHead 中完成)。这里的 item !

86820
  • 每日一题《剑指offer》链表篇之从尾到头打印链表

    但是我们都知道递归是到达底层后才会往上回溯,因此我们可以考虑递归遍历链表,因此三段式如下: 终止条件: 递归进入链表尾,即节点空节点结束递归。 返回值: 每次返回子问题之后的全部输出。...本级任务: 每级子任务递归地进入下一级,等下一级的子问题输出数组返回,将自己的节点值添加在数组末尾。 具体做法: step 1:从表头开始往后递归进入每一个节点。.../输出栈中元素到数组中 while(!...,因此也可以使用递归: 终止条件: 当一个链表已经因为递归到了末尾,另一个链表剩余部分一定都大于前面的,因此我们可以另一个链表剩余部分拼在结果后面,结束递归。...step 2:递归回来的结果我们要加在当前较小值的节点后面,相当于不断较小值后面添加节点。 step 3:递归的终止是两个链表有一个空。

    15010

    数据结构之链表

    对于链表来说,链表头部添加元素是十分方便的,对于链表来说,我们设置一个链表的头,Node类型的head变量,在跟踪链表的头部,所以链表头部添加元素是十分方便的。   ...4)、链表中间添加新的元素,首先创建出新元素的节点node,如何新的节点插入到正确的位置呢,那么就必须要找到当我们插入新的元素节点之后这个节点之前的那个节点是谁。...无参的构造函数 59 */ 60 public LinkedList() { 61 head = null;// 初始化一个链表head空,一个元素都没有...上面是链表添加元素添加元素的时候遇到的一个问题,链表的任意一个位置添加元素的时候,链表添加元素和在链表的其他位置添加元素,逻辑上存在差别。...,所以设置null空,这个空节点称为链表真正的head,称为dummyHead(虚拟头节点),此时来说,链表的第一个元素就是dummyHead的下一个节点(next)所对应的节点的元素,而不是dummyHead

    53910

    一文带你拿下前端必备数据结构 -- 链表 !!

    接下来,需要把tail的引用更新列表中倒数第二个元素,同时next指针指向null,这个过程可以展示下图: ?...// 如果链表的长度1,删除后末尾应当null if(this.size === 1) { this.tail = null...this.head = null } // 末尾添加节点 append(element) {} // 在任意位置插入节点 insert(position,element...this.size++ } 2.3.3 链表中插入节点 同样的有两种场景 当插入的位置是第一个,不同于单向链表的操作是,需要额外的链表的最后一个节点的next指针指向新节点node 在其他地方插入时...2.3.4 链表中删除特定位置的节点 区别于单向链表,删除第一个节点,需要改变最后一个节点的next指向,指向新的第一个节点,删除其他节点,需要判断以下被删除节点的前一个节点的next指向是否

    68640

    链表

    链表在内存中存储如下示意图 head头节点的下一个节点地址150即a1,a1下一个节点地址110即a2,a2的下一个节点地址是180即a3.......2.当我们创建第一个节点的时候就让头节点的next域指向第一个节点,当然这个节点包含data域和next域,data存放这个节点的数据,next默认为null 3.当我们每次向单链表添加数据,都要遍历单链表中的数据...(因为要拿到nextnull的节点),当找到这个nextnull的节点后,我们让这个节点的next指向新添加的节点,同时新添加的节点的next被置null 4.这样一直反复就形成了一个链式存储。...我们原来单链表的基础之上添加一个需求---要求单链表的节点按照ID编号顺序插入 思路分析 1.添加节点,首先我们要找到新添加的节点位置 如下2节点,当他即将被插入时,首先要获取他链表上的位置...=null){ temp = temp.next; } /找到最后一个节点,新节点添加到双向链表末尾 temp.next = usernode

    37910

    Java 并发包中并发原理剖析之ConcurrentLinkedQueue

    从下面的无参构造函数可知,默认的头、尾节点都是指向itemnull的哨兵节点。新元素会被插入队列末尾,出队从队列头部获取一个元素。...通过CAS节点的引用指向null,自动的会将它从队列中移除。来自head的所有元素的可达性必须保持true,即使导致head前进的并发修改的情况下也是如此。...t : q; } } offer 操作队列末尾添加一个元素,如果该元素null,则抛出NPE异常,否则由于ConcurrentLinkedQueue是无界队列,该方法一直会返回...由于使用CAS无阻塞算法,因此该方法不会阻塞挂起调用的线程。 add add操作是链表末尾添加一个元素,其实在内部调用的还是offer操作。...队列是靠头、尾节点来维护的,创建队列头、尾节点指向-个 item null 的哨兵节点。第一次执行 peek 或者first 操作时会把 head 指向第一个真正的队 列元素

    41420

    Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析

    从下面的无参构造函数可知,默认头、尾节点都是指向itemnull的哨兵节点。 新元素会被插入队列末尾,出队从队列头部获取一个元素。...offer 链表末尾添加一个元素 /** * Inserts the specified element at the tail of this queue....首先代码(1)对传参进行空检查,如果null抛出NPE异常,否则执行代码(2)并使用item作为构造函数参数创建一个新的节点,然后代码(3)从队列尾部节点开始循环,打算从队列尾部添加元素,当执行到代码...add add操作是链表末尾添加一个元素,其实在内部调用的还是offer操作’\ /** * Inserts the specified element at the tail of this...另外,第一次调用peek操作,会删除哨兵节点,并让队列的head节点指向队列里面第一个元素或者null

    29720

    常见的线性结构

    添加操作:为了防止添加的时候,抛出数组已满的异常,我们可以向数组中添加元素的时候,判断数组受否已满,若满了,则进行扩容操作,这里我们扩容原来的2倍 public void add(int...,直接元素添加到队尾位置就可以了,即索引为trail的位置;进行出队操作,我们也可以通过front索引来获取队首元素,并进行删除,这样就可以实现队列的入队和出队操作的时间复杂度都为O(1)了。...同时为了节约空间内存,删除元素后,释放的空间,我们添加新的元素,是可以放在这些位置上的,就像一个环一样,不过要留出一个空位置,用来表示这个队列为空,即当front == tai表示空。...public void add(int index,E e){ //判断index是否合法 //注意:与数组不同的是,链表这里的index是可以等于size的,此时表示链表末尾添加元素...(ListNode head, int val) { //当给定的链表,直接返回 if (head == null) { return head

    16010

    LinkedHashMap源码分析,死磕到底

    通过上面的继承体系,我们知道它继承了Map,所以它的内部也有这三种结构,但是它还额外添加了一种“双向链表”的结构存储所有元素的顺序。...添加删除元素的时候需要同时维护HashMap中的存储,也要维护LinkedList中的存储,所以性能上来说会比HashMap稍慢。...afterNodeAccess(Node e)方法 节点访问之后被调用,主要在put()已经存在的元素或get()被调用,如果accessOrdertrue,调用这个方法把访问到的节点移动到双向链表末尾...,并且访问的节点不是尾节点; (2)从双向链表中移除访问的节点; (3)把访问的节点加到双向链表末尾;(末尾最新访问的元素) afterNodeRemoval(Node e)方法 节点被删除之后调用的方法...如果使用LinkedHashMap,我们把accessOrder设置true是不是就差不多能实现这个策略了呢?答案是肯定的。

    54710

    死磕 java集合之LinkedHashMap源码分析

    通过上面的继承体系,我们知道它继承了HashMap,所以它的内部也有这三种结构,但是它还额外添加了一种“双向链表”的结构存储所有元素的顺序。...添加删除元素的时候需要同时维护HashMap中的存储,也要维护LinkedList中的存储,所以性能上来说会比HashMap稍慢。...afterNodeAccess(Node e)方法 节点访问之后被调用,主要在put()已经存在的元素或get()被调用,如果accessOrdertrue,调用这个方法把访问到的节点移动到双向链表末尾...; (2)从双向链表中移除访问的节点; (3)把访问的节点加到双向链表末尾;(末尾最新访问的元素) afterNodeRemoval(Node e)方法 节点被删除之后调用的方法。...如果使用LinkedHashMap,我们把accessOrder设置true是不是就差不多能实现这个策略了呢?答案是肯定的。

    42740

    【Python编程挑战】:单链表实现技巧与最佳实践

    链表结点类 链表中,假定每个结点LinkNode类对象,它包括存储元素的数据成员,这里用data表示,还包括存储后继结点的指针属性,这里用next表示。...self.next = None 设计单链表LinkList,其中head属性链表的头结点,构造方法用于创建 这个头结点,并且设置head结点的next空: # 单链表类 class LinkList...第3步:如果插入位置是 0,则直接把生成的结点的后继结点,设置当前的链表头结点,并且把生成的结点设置新的链表头。...单向链表元素修改 1、元素修改的概念 单向链表元素修改是指链表中指定索引的元素更新新的值。 2、元素修改的步骤 第1步:直接通过索引访问即可获得对应的结点,修改成指定的值。...while j < i and p is not None: j += 1 p = p.next return p # 在线性表的末尾添加一个元素

    8900

    TypeScript算法题实战——链表篇(链表的设计、反转、两两交换、删除、相交和环形链表

    链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):链表的第一个元素之前添加一个值 val 的节点。...插入后,新节点将成为链表的第一个节点。addAtTail(val): val 的节点追加到链表的最后一个元素。...addAtIndex(index,val):链表中的第 index 个节点之前添加 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表末尾。...,curNode的next设置curNode.next.next,最后处理一下如果index=size-1,需要删除尾结点的情况(因为要重新设置tail)。...curNode = curNode.next; } return curNode.val; } addAtHead(val: number): void { // 链表的第一个元素之前添加一个值

    12510

    【Leetcode】单链表常见题

    设置一个快指针,一次走两步,慢指针一次走一步,当节点个数奇数,意味着我的快指针指向尾节点,慢指针指向中间节点,此时的判断条件快指针节点的next指针指向空 当节点个数偶数,意味着当我快指针刚好...这确保了代码不会试图 NULL 指针上进行成员访问 3.返回倒数第K个节点: 题目链接: 面试题02.02.返回倒数第K个节点 题目描述: 简单思路: 设置两个指针,一个先走k步,再两个指针同时前移直到前一个指向空...这就是为什么当我一个指针放在链表头部,另一个保留在首次相遇点,它们以相同的速度移动,它们相遇的点就是环的起始节点 struct ListNode *detectCycle(struct ListNode...我们的目标是head节点放到最后,即n1->head->null并将n1的next设置null。 执行反转:递归调用自身,传入head->next作为新的链表头,直到链表末尾。...然后设置head->next->next = head(这实现了反转),再将head->next设置null(断开原来的连接) 返回新的头节点:递归的最深处返回新的头节点,每层递归都返回这个头节点

    7610

    Java集合--非阻塞队列(ConcurrentLinkedQueue实现原理)

    ,会抛出异常,禁止向队列中插入尾空元素; 创建插入元素的新结点newNode,从tail指针处遍历链表结构。...ConcurrentLinkedQueue中,当插入一个结点,并不会每插入一次都改变一次tail结点的指向,当我们发现p/t不同时,也就是说最后一个结点和tail结点不为同一个,我们就需要调用casTail...当我们再添加完首个元素后,立即进行出队操作,此时再去添加一个元素,那么就会在循环中直接进入⑵的判断中。此时需要结合出队代码一块学习。...进入第二个循环p==q,回看上面的优化代码,得到p=head;开始第二次循环,head在出队设置成了指向第一次插入的元素(此时该元素的值null,但结点依旧存在)。...但有一点不同的是,peek()方法并不会移除头结点中的元素,而poll()改变head指向的同时还移除了头结点中的元素,将其置null

    1.4K70

    左程云算法一星难度题目刷题(1)

    //boolean add(E e);         //boolean offer(E e);         //他们的共同之处是建议实现类禁止添加 null 元素,否则会报空指针...NullPointerException;         //不同之处在于 add() 方法添加失败(比如队列已满)时会报 一些运行时错误 错;而 offer() 方法即使添加失败不会奔溃,...//返回头部         //E element();         //E peek();         //当队列为空 element() 抛出异常;peek() 不会奔溃,只会返回 null...(int i = k; i > 0; i--) {             fast = fast.next;         }         // 此时让慢指针和快指针同时走,知道快指针到达链表末尾...(int i = k; i > 0; i--) {             fast = fast.next;         }         // 此时让慢指针和快指针同时走,知道快指针到达链表末尾

    320120

    【数据结构与算法】详解什么是双向链表,并用代码手动实现一个双向链表

    this.next = null this.prev = null } } (3)实现append()方法 append()方法就是元素添加到双向链表末尾。...position 与 length相等,就相当于末尾添加元素 this.append(item) } // 4....执行一次 insert()方法 di.append('js') //末尾添加元素 js dl.insert(1, 'python') //索引 1处插入元素python...最后我们再向索引为 3 的位置插入元素 java,因为此时 length = 3,即双向链表元素个数 3,这就相当于末尾添加元素 dl.insert(3, 'java') 所以此时的链表是这样的...是否 0,若等于 0,则直接第一个链表的 next 值赋值给 head,然后 length - 1 若 position 不等于 0而等于 length - 1,则将末尾元素的前一个元素,即 tail

    59520

    okio 的使用及源码分析

    其中 Source 输入流、Sink 输出流。...超时机制 Timeout 以输出流 Sink 例,当我们用下面的方法包装输出流的时候: public static Sink sink(OutputStream out) { return...开始读写操作前,会给 AsyncTimeout 设置超时时间,并将其加入到一个单链表中,单链表中的节点按照剩余时间由短到长排列。...由于 Buffer 是以 Segment 链表来管理元素,所以 Buffer 间要转移元素的时候,并不用进行数组元素的拷贝,只要改变链表头指针的所有者即可。...提供超时机制 内部会根据不同情况进行同步计时或异步计时,超时后会抛出异常,不会阻塞线程。而且不仅在 IO 操作有超时判断, flush、close 等方法也有超时判断。

    1K20

    JavaScript实现单向链表数据结构

    head = null; } 骨架中,我们需要一个Node类来作为基础节点,每一个节点都是通过new Node来实现的,length用来存储整个链表的长度,head指向链表的头。...与数组的length属性类似 toString():由于列表项使用了Node类,就需要重写继承自JavaScript对象默认的toString方法,让其只输出元素的值 append方法 append方法实现的是向链表末尾添加一个元素...var current = null; if(head==null){ //此时链接长度空,直接插入为首元素 head = node; }else...= node; } //更新链表长度 length++; } 添加首先要判断的是链表长度是否空,也就是head元素是否null,也可以判断length是否0。...我们创建的Node类中next始终null,代表的是新创建的元素末尾元素,其nextnull,如果next不为空,则说明该值不是末尾元素,这添加末尾元素提供了判断依据。

    1.3K30
    领券