链表数据结构包括一系列连接的节点。在这里,每个节点都存储下一个节点的数据和地址。例如,
您必须从某个地方开始,所以我们给第一个节点的地址一个特殊的名称,称为HEAD 。
同样,可以确定链表中的最后一个节点,因为其下一部分指向NULL 。
您可能玩过寻宝游戏,其中每个线索都包含有关下一个线索的信息。这就是链接列表的操作方式。
LinkedList的表示
让我们看看如何表示LinkedList的每个节点。每个节点包括:
- 数据项
- 另一个节点的地址
我们将数据项和下一个节点引用都包装在一个结构中,如下所示:
struct node
{
int data;
struct node *next;
};
了解链接列表节点的结构是掌握链接列表节点的关键。
每个结构节点都有一个数据项和一个指向另一个结构节点的指针。让我们创建一个包含三个项目的简单链接列表,以了解其工作原理。
/* Initialize nodes */
struct node *head;
struct node *one = NULL;
struct node *two = NULL;
struct node *three = NULL;
/* Allocate memory */
one = malloc(sizeof(struct node));
two = malloc(sizeof(struct node));
three = malloc(sizeof(struct node));
/* Assign data values */
one->data = 1;
two->data = 2;
three->data=3;
/* Connect nodes */
one->next = two;
two->next = three;
three->next = NULL;
/* Save address of first node in head */
head = one;
如果您不懂上述任何几行,那么您只需要对指针和结构进行复习。
仅需几个步骤,我们就创建了一个包含三个节点的简单链表。
LinkedList的功能来自断开链并重新加入链的能力。例如,如果您想将元素4放在1和2之间,则步骤为:
- 创建一个新的结构节点并为其分配内存。
- 将其数据值加为4
- 将其下一个指针指向包含2作为数据值的struct节点
- 将下一个指针“ 1″更改为我们刚刚创建的节点。
在数组中执行类似操作将需要移动所有后续元素的位置。
在Python和Java中,可以使用如下代码所示的类来实现链表。
链表实用程序
列表是最流行和最有效的数据结构之一,可以在每种编程语言(如C,C++, Python,Java和C#)中实现。
除此之外,链接列表是了解指针如何工作的好方法。通过练习如何操作链表,您可以准备学习更高级的数据结构,例如图形和树。
Python,Java,C和C++示例中的链表实现
Python
爪哇
C
C +
# Linked list implementation in Python
class Node:
# Creating a node
def __init__(self, item):
self.item = item
self.next = None
class LinkedList:
def __init__(self):
self.head = None
if __name__ == '__main__':
linked_list = LinkedList()
# Assign item values
linked_list.head = Node(1)
second = Node(2)
third = Node(3)
# Connect nodes
linked_list.head.next = second
second.next = third
# Print the linked list item
while linked_list.head != None:
print(linked_list.head.item, end=" ")
linked_list.head = linked_list.head.next
// Linked list implementation in Java
class LinkedList {
// Creating a node
Node head;
static class Node {
int value;
Node next;
Node(int d) {
value = d;
next = null;
}
}
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
// Assign value values
linkedList.head = new Node(1);
Node second = new Node(2);
Node third = new Node(3);
// Connect nodess
linkedList.head.next = second;
second.next = third;
// printing node-value
while (linkedList.head != null) {
System.out.print(linkedList.head.value + " ");
linkedList.head = linkedList.head.next;
}
}
}
// Linked list implementation in C
#include
#include
// Creating a node
struct node {
int value;
struct node *next;
};
// print the linked list value
void printLinkedlist(struct node *p) {
while (p != NULL) {
printf("%d ", p->value);
p = p->next;
}
}
int main() {
// Initialize nodes
struct node *head;
struct node *one = NULL;
struct node *two = NULL;
struct node *three = NULL;
// Allocate memory
one = malloc(sizeof(struct node));
two = malloc(sizeof(struct node));
three = malloc(sizeof(struct node));
// Assign value values
one->value = 1;
two->value = 2;
three->value = 3;
// Connect nodes
one->next = two;
two->next = three;
three->next = NULL;
// printing node-value
head = one;
printLinkedlist(head);
}
// Linked list implementation in C++
#include
using namespace std;
// Creating a node
class Node {
public:
int value;
Node* next;
};
int main() {
Node* head;
Node* one = NULL;
Node* two = NULL;
Node* three = NULL;
// allocate 3 nodes in the heap
one = new Node();
two = new Node();
three = new Node();
// Assign value values
one->value = 1;
two->value = 2;
three->value = 3;
// Connect nodes
one->next = two;
two->next = three;
three->next = NULL;
// print the linked list value
head = one;
while (head != NULL) {
printf("%d ", head->value);
head = head->next;
}
}
链表复杂度
时间复杂度
Worst case | Average Case | |
---|---|---|
Search | O(n) | O(n) |
Insert | O(1) | O(1) |
Deletion | O(1) | O(1) |
空间复杂度:O(n)
链表应用
- 动态内存分配
- 在堆栈和队列中实现
- 撤消软件功能
- 哈希表,图形
推荐读物
1.教程
- LinkedList操作(遍历,插入,删除)
- LinkedList的类型
- Java LinkedList
2.例子
- 一次迭代即可获取LinkedList的中间元素
- 将LinkedList转换为数组,反之亦然
- 检测LinkedList中的循环