数据结构头插法尾插法区别
时间: 2024-03-24 15:34:48 浏览: 134
数据结构中的头插法和尾插法是两种常见的插入元素的方式,它们的区别如下:
1. 头插法:
头插法是将新元素插入到链表或者队列的头部。具体步骤如下:
- 创建一个新节点,并将新节点的值设置为待插入的元素。
- 将新节点的指针指向原链表或队列的头节点。
- 更新链表或队列的头节点为新节点。
2. 尾插法:
尾插法是将新元素插入到链表或者队列的尾部。具体步骤如下:
- 创建一个新节点,并将新节点的值设置为待插入的元素。
- 将新节点的指针指向空(对于链表)或者下一个节点(对于队列)。
- 更新链表或队列的尾节点为新节点。
区别:
- 插入顺序:头插法在链表或队列的头部插入元素,而尾插法在链表或队列的尾部插入元素。
- 时间复杂度:头插法和尾插法的时间复杂度都是O(1),因为只需要修改少量指针即可完成插入操作。
- 元素顺序:使用头插法插入的元素会逆序排列,而使用尾插法插入的元素会保持原有顺序。
相关问题
数据结构头插法C语言
在C语言中,头插法是一种常见的链表插入方法,指的是新插入的元素总是成为链表的第一个元素。这种方式的特点是插入操作的时间复杂度为O(1),因为不需要遍历链表就能完成插入。下面是使用头插法创建链表的一个简单例子:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
exit(1); // 分配内存失败,退出程序
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 头插法插入节点
void insertAtHead(Node** head, int data) {
Node* newNode = createNode(data);
newNode->next = *head;
*head = newNode;
}
// 打印链表
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
// 释放链表内存
void freeList(Node* head) {
Node* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
int main() {
Node* head = NULL; // 初始化链表头指针为NULL
// 使用头插法插入数据
insertAtHead(&head, 3);
insertAtHead(&head, 2);
insertAtHead(&head, 1);
// 打印链表
printList(head);
// 释放链表内存
freeList(head);
return 0;
}
```
在这个例子中,我们首先定义了一个链表节点的结构体`Node`,然后通过`createNode`函数创建新节点,并在`insertAtHead`函数中实现头插法。每次插入时,新节点成为链表的第一个节点,而之前的头节点则被移动到新节点的下一个位置。最后,`printList`函数用于打印链表,而`freeList`函数用于释放链表占用的内存资源。
c++ 语言链表头插法
链表的头插法是指将新的节点插入到链表的头部,使其成为新的头节点。C++语言实现链表头插法的代码如下:
```c++
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* insertAtHead(ListNode* head, int val) {
ListNode* newNode = new ListNode(val);
newNode->next = head;
return newNode;
}
void printList(ListNode* head) {
ListNode* curr = head;
while (curr) {
cout << curr->val << " ";
curr = curr->next;
}
cout << endl;
}
int main() {
ListNode* head = NULL;
// 插入元素
head = insertAtHead(head, 3);
head = insertAtHead(head, 2);
head = insertAtHead(head, 1);
// 打印链表
printList(head);
return 0;
}
```
在上面的代码中,我们定义了一个链表节点结构体 `ListNode`,其中包含一个整型变量 `val` 和一个指向下一个节点的指针 `next`。我们还定义了两个函数,一个用于在链表头插入新的节点 `insertAtHead`,另一个用于打印链表的所有节点 `printList`。
在 `insertAtHead` 函数中,我们首先创建一个新的节点 `newNode`,并将它的值设置为 `val`。然后将新节点的 `next` 指向当前链表头节点 `head`,最后将新节点作为新的头节点返回。
在 `main` 函数中,我们先初始化头节点 `head` 为空指针。然后使用 `insertAtHead` 函数向链表中插入三个元素。最后使用 `printList` 函数打印链表中的所有元素。
链表头插法是链表常用的一种操作,它的时间复杂度为 $O(1)$,非常高效。
阅读全文