双向链接列表
双向链接列表是线性数据结构。它是定义为节点的对象的集合。但是与链接列表不同,该节点有两个指针,一个是前一个指针,另一个是下一个指针。就像链表节点存储在内存中的随机位置中,而不是存储在连续位置中一样。
双向链接列表 vs 链接列表
-
双向链接列表允许我们在向前和向后的方向上遍历链接列表,但这是以
prev
指针为每个节点所需的额外空间为代价的。 - 在双向链表中插入元素非常容易,因为我们不必维护多个指针或遍历链表来查找先前的指针,但是与链表相比,我们必须修改更多的指针。
双向链接列表遍历算法
前进方向
令 head
成为链接列表的第一个节点。
-
初始化
curr
,指向链接列表的head
节点。 -
虽然
curr
尚未到达列表的末尾,即curr
!=null
,但请执行以下操作:- 打印存储在当前节点内的数据。
-
curr=curr->next
; -
如果是最后一个节点,则存储为
tail
,以方便向后遍历。
同样,我们可以通过从 tail
开始并将 curr
更改为 curr->prev
来进行向后遍历。
反方向
令 tail
为链表的最后一个节点。
-
初始化
curr
,指向链接列表的tail
节点。 -
虽然
curr
尚未到达列表的开头,即curr
!=null
,但请执行以下操作:- 打印存储在当前节点内的数据。
-
curr = curr->上一个
双向链接列表插入
双向链接列表在插入元素时有 4
种情况,就像链表一样。
将节点插入 dll push()
的开头
-
使用数据
x
和prev
创建为null
的新节点temp
。 -
将
temp->next
设置为head
,将head->prev
设置为temp
,以在head
之前插入temp
。 -
将
temp
设置为链接列表的开头。
在 append()
dll 末尾插入节点
-
创建一个新节点
temp
,其数据为x
,并且其prev
为null
。 -
初始化指向
head
的tail
。 -
如果链接列表为空,则将
temp
设置为链接列表的head
,然后返回。 -
否则,迭代链接列表的末尾,使
tail->next
!=null
,以便你到达最后一个元素 -
将
tail->next
设置为temp
,将temp->prev
设置为tail
。
在给定节点 insertbefore()
之前插入节点
-
如果
next
==null
,则返回; -
用数据
x
创建一个新节点curr
。 -
将
curr->prev
设置为next->prev
,以在next
之前添加一个新节点,将next->prev
设置为curr
,以建立后向链接。 -
将
curr->next
设置为next
,最后检查curr->prev
是否为null
。 -
如果不是
null
,则将curr->prev->next
设置为curr
以完成插入,否则curr
是链接列表的第一个节点。将head
设置为curr
。
在给定节点 insertafter()
之后插入节点
-
如果
prev
==null
,则返回; -
用数据
x
创建一个新节点curr
。 -
将
curr->next
设置为prev->next
,以在prev
之后添加一个新节点,并将prev->next
设置为curr
,以建立前向链接。 -
将
curr->prev
设置为prev
,最后检查curr->next
是否为 null。如果不是null
,则将curr->next->prev
设置为curr
以完成插入。
双向链接列表插入过程
-
将节点插入 dll
push()
的开头 -
在
append()
dll 末尾插入节点 -
在给定节点
insertbefore()
之前插入节点 -
在给定节点
insertafter()
之后插入节点
双向链接列表遍历和插入实现
#include using namespace std;
class node {
public:
int data;
node* next;
node* prev;
};
void push(node** head, int x)
{
node* curr = new node();
curr->data = x;
curr->next = (*head);
curr->prev = null;
if ((*head) != null)
(*head)->prev = curr;
(*head) = curr;
}
void insertafter(node* prev, int x)
{
if (prev == null)
{
cout << "the given previous node cannot be null";
return;
}
node* curr = new node();
curr->data = x;
curr->next = prev->next;
prev->next = curr;
curr->prev = prev;
if (curr->next != null)
curr->next->prev = curr;
}
void insertbefore(struct node** head, struct node* next, int x)
{ if (next == null) {
return;
}
node* curr = new node();
curr->data = x;
curr->prev = next->prev;
next->prev = curr;
curr->next = next;
if (curr->prev != null)
curr->prev->next = curr;
else
(*head) = curr;
}
void append(node** head, int x)
{
node* curr = new node();
node* tail = *head;
curr->data = x;
curr->next = null;
if (*head == null)
{
curr->prev = null;
*head = curr;
return;
}
while (tail->next != null)
tail = tail->next;
tail->next = curr;
curr->prev = tail;
return;
}
void printlist(node* node)
{
node* tail = null;
cout << "forward traversal:";
while (node != null)
{
cout << " " << node->data << " ";
tail = node;
node = node->next;
}
cout << "\nreverse traversal:";
while (tail != null)
{
cout << " " << tail->data << " ";
tail = tail->prev;
}
cout << "\n";
}
int main()
{
node* head = null;
append(&head, 6);
push(&head, 7);
push(&head, 1);
append(&head, 4);
printlist(head);
insertafter(head->next, 8);
insertbefore(&head, head->next->next, 3);
printlist(head);
return 0;
}
双向链接列表遍历和插入算法的复杂性
遍历
- 平均情况
要遍历完整的双向链表,我们必须访问每个节点。因此,如果它具有 n
个节点,则遍历的平均情况下时间复杂度约为 o(n)
。时间复杂度约为 o(n)
。
- 最佳情况
最佳情况下的时间复杂度是 o(n)
。它与平均情况下的时间复杂度相同。
- 最坏情况
最差的时间复杂度是 o(n)
。它与最佳情况下的时间复杂度相同。
遍历算法的空间复杂度为 o(1)
,因为除 curr
指针外不需要其他空间。
插入方式
- 平均情况
在所有 4
情况下插入一个元素最多需要 4
链接更改,因此插入的时间复杂度为 o(1)
。
- 最佳情况
最佳情况下的时间复杂度是 o(1)
。它与平均情况下的时间复杂度相同。
- 最坏情况
最坏情况下的时间复杂度是 o(1)
。它与最佳情况下的时间复杂度相同。
对于所有 4
种插入方式,插入算法的空间复杂度为 o(1)
。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
java 中的 trie 数据结构
发布时间:2023/08/05 浏览次数:127 分类:java
-
本文介绍了 java 中的 trie 数据结构。java 中的 trie 数据结构 trie 词是从单词 retrieval 中提取出来的,它是一种用于存储字符串集合的排序数据结构。
将二叉树转换为二叉搜索树
发布时间:2023/03/20 浏览次数:185 分类:算法
-
本教程教大家如何将二叉树转换为二叉搜索树。二叉树是一种非线性数据结构。它被称为二叉树,因为每个节点最多有两个子节点。这些子节点被称为左子和右子。
发布时间:2023/03/20 浏览次数:232 分类:算法
-
本教程介绍了二叉树上的树遍历中序遍历、前序遍历和后序遍历。
发布时间:2023/03/20 浏览次数:209 分类:算法
-
本教程告诉我们如何使用合并排序对链接列表进行排序。
发布时间:2022/04/10 浏览次数:95 分类: