链表算法、双链表算法、循环链表算法
链表是一系列数据结构,通过链接连接在一起。
链接列表是包含项目的一系列链接。每个链接都包含与另一个链接的连接。链表是数组后第二常用的数据结构。以下是理解链表的概念的重要术语。
链表可以显示为节点链,其中每个节点指向下一个节点。
根据以上说明,以下是要考虑的重点。
以下是各种类型的链表。
以下是列表支持的基本操作。
在链表中添加新节点是一个以上的步骤活动。我们将在这里用图表来学习。首先,使用相同的结构创建一个节点,并找到它必须插入的位置。
想象一下,我们在 A (LeftNode)和 C (RightNode)之间插入节点 B (NewNode)。然后将B.next指向C
NewNode.next −> RightNode;
看起来应该是这样的 -
现在,左侧的下一个节点应指向新节点。
LeftNode.next −> NewNode;
这将把新节点放在两者的中间。新列表应如下所示 -
如果在列表的开头插入节点,则应采取类似的步骤。在末尾插入时,列表的倒数第二个节点应指向新节点,新节点将指向NULL。
删除也是一个不止一步的过程。我们将学习图画表达。首先,使用搜索算法找到要删除的目标节点。
现在,目标节点的左(前)节点应指向目标节点的下一个节点
LeftNode.next −> TargetNode.next;
这将删除指向目标节点的链接。现在,使用以下代码,我们将删除目标节点指向的内容。
TargetNode.next −> NULL;
我们需要使用已删除的节点。我们可以将其保留在内存中,否则我们可以简单地释放内存并完全擦除目标节点。
这项操作是彻底的。我们需要让头节点指向最后一个节点并反转整个链表。
首先,我们遍历列表的末尾。它应该指向NULL。现在,我们将指出它的前一个节点 -
我们必须确保最后一个节点不是丢失的节点。所以我们将有一些临时节点,它看起来像指向最后一个节点的头节点。现在,我们将使所有左侧节点逐个指向它们之前的节点。
除了头节点指向的节点(第一个节点)之外,所有节点都应指向它们的前任,使它们成为新的后继节点。第一个节点将指向NULL。
我们将使用temp节点使头节点指向新的第一个节点。
双向链接列表是链接列表的变体,与单链接列表相比,可以以两种方式轻松地向前和向后导航。以下是理解双向链表概念的重要术语。
根据以上说明,以下是要考虑的重点。
以下是列表支持的基本操作。
下面的代码演示了双向链表开头的插入操作。
//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;
}
圆形链接列表是链接列表的变体,其中第一个元素指向最后一个元素,最后一个元素指向第一个元素。单链表和双链表都可以制成循环链表。
在单链表中,最后一个节点的下一个指针指向第一个节点。
在双向链表中,最后一个节点的下一个指针指向第一个节点,第一个节点的前一个指针指向最后一个节点,在两个方向上形成圆形。
根据以上说明,以下是要考虑的重点。
以下是循环列表支持的重要操作。
下面的代码演示了基于单个链表的循环链表中的插入操作。
//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()) {
head = link;
head->next = head;
} else {
//point it to old first node
link->next = head;
//point first to new first node
head = link;
}
}
下面的代码演示了基于单个链表的循环链表中的删除操作。
//delete first item
struct node * deleteFirst() {
//save reference to first link
struct node *tempLink = head;
if(head->next == head) {
head = NULL;
return tempLink;
}
//mark next to first link as first
head = head->next;
//return the deleted link
return tempLink;
}
以下代码演示了循环链表中的显示列表操作。
//display the list
void printList() {
struct node *ptr = head;
printf("\n[ ");
//start from the beginning
if(head != NULL) {
while(ptr->next != ptr) {
printf("(%d,%d) ",ptr->key,ptr->data);
ptr = ptr->next;
}
}
printf(" ]");
}