📅  最后修改于: 2021-01-11 06:42:18             🧑  作者: Mango
双链表是链表的一种变体,与单链表相比,双向导航都可以轻松实现。以下是理解双向链表概念的重要术语。
链接-链接列表的每个链接可以存储称为元素的数据。
下一个-链表中的每个链接都包含指向下一个称为下一个链接的链接。
上一个-链表中的每个链接都包含一个指向上一个链接的链接,称为上一个。
LinkedList-链接列表包含到第一个链接(称为First)和最后一个链接(称为Last)的连接链接。
根据上面的说明,以下是要考虑的重点。
双链表包含一个名为first和last的链接元素。
每个链接包含一个数据字段和两个链接字段,分别称为next和prev。
每个链接都使用其下一个链接与其下一个链接链接。
每个链接都使用其先前的链接与其先前的链接链接。
最后一个链接带有一个空链接,以标记列表的结尾。
以下是列表支持的基本操作。
插入-在列表的开头添加一个元素。
删除-删除列表开头的元素。
插入最后-在列表的末尾添加一个元素。
最后删除-从列表末尾删除元素。
在以下位置插入-在列表项之后添加元素。
删除-使用键从列表中删除元素。
向前显示-以向前方式显示完整列表。
向后显示-向后显示完整列表。
以下代码演示了在双链表开头的插入操作。
//insert link at the first location
void insertFirst(int key, int data) {
//create a link
struct node *link = (struct node*) malloc(sizeof(struct node));
link->key = key;
link->data = data;
if(isEmpty()) {
//make it the last link
last = link;
} else {
//update first prev link
head->prev = link;
}
//point it to old first link
link->next = head;
//point first to new first link
head = link;
}
以下代码演示了双向链表开头的删除操作。
//delete first item
struct node* deleteFirst() {
//save reference to first link
struct node *tempLink = head;
//if only one link
if(head->next == NULL) {
last = NULL;
} else {
head->next->prev = NULL;
}
head = head->next;
//return the deleted link
return tempLink;
}
以下代码演示了在双链表的最后位置的插入操作。
//insert link at the last location
void insertLast(int key, int data) {
//create a link
struct node *link = (struct node*) malloc(sizeof(struct node));
link->key = key;
link->data = data;
if(isEmpty()) {
//make it the last link
last = link;
} else {
//make link a new last link
last->next = link;
//mark old last node as prev of new link
link->prev = last;
}
//point last to new last node
last = link;
}
要查看C编程语言的实现,请单击此处。