Go 如何实现不使用尾部指针的双链表

Go 如何实现不使用尾部指针的双链表,go,data-structures,linked-list,doubly-linked-list,Go,Data Structures,Linked List,Doubly Linked List,在双链表中有必要有一个尾部指针吗?如何在没有尾部指针的情况下实现双链表插入,如果我们这样做,时间复杂度会是多少。如果您知道要在之前或之后插入的节点,那么复杂度是O(1)。仅将上一个/下一个节点中的指针设置为指向新节点,并将新节点中的指针设置为上一个/下一个节点。如果插入到列表的开头,还可以更新头指针 如果在双链接列表(或单链接列表)中没有尾部指针,并且没有对最后一个元素的引用,那么附加到列表中就变成了O(n),因为必须遍历列表才能找到最后一个元素 不,没有必要。下面是不使用tail指针的双链接列

在双链表中有必要有一个尾部指针吗?如何在没有尾部指针的情况下实现双链表插入,如果我们这样做,时间复杂度会是多少。

如果您知道要在之前或之后插入的节点,那么复杂度是O(1)。仅将上一个/下一个节点中的指针设置为指向新节点,并将新节点中的指针设置为上一个/下一个节点。如果插入到列表的开头,还可以更新头指针


如果在双链接列表(或单链接列表)中没有尾部指针,并且没有对最后一个元素的引用,那么附加到列表中就变成了O(n),因为必须遍历列表才能找到最后一个元素

不,没有必要。下面是不使用
tail
指针的双链接列表的时间复杂性

在列表前加前缀:O(1)

(新节点x的头部)

在列表中的两个节点之间插入:O(n)

(头部x新节点y)

附加到列表中:O(n)

(头部x y新节点)

注:利用双链表的
尾部将使复杂性为O(1)


TL;DR:不,除了性能较差的附加案例O(n)外,它的功能几乎相同