顺序表改为链表,链表表头带空头节点
时间: 2024-02-02 09:03:51 浏览: 109
带头节点的链表
顺序表是一种线性数据结构,它在计算机内存中是连续存储的。而链表是一种动态数据结构,它通过指针将节点链接在一起,不需要连续的内存空间。
为了将顺序表改为链表,我们需要进行以下步骤:
1. 定义链表节点结构体
链表节点结构体包含两个部分:数据和指针。数据部分用来存储节点的值,指针部分用来指向下一个节点。
```C++
struct ListNode
{
int val;
ListNode* next;
};
```
2. 创建空头节点
为了方便操作链表,我们可以在表头添加一个空节点,使得链表的第一个节点成为真正的表头。空节点的值可以设置为任意值,但是它的指针部分应该指向第一个节点。
```C++
ListNode* head = new ListNode();
head->next = nullptr;
```
3. 将顺序表中的元素转换为链表节点
遍历顺序表中的元素,为每个元素创建一个新的链表节点,并将其插入到链表中。插入节点的方法有两种:头插法和尾插法。
头插法是将新节点插入到链表的头部,它的时间复杂度为 O(1)。
```C++
ListNode* newNode = new ListNode();
newNode->val = value;
newNode->next = head->next;
head->next = newNode;
```
尾插法是将新节点插入到链表的尾部,需要遍历整个链表,时间复杂度为 O(n)。
```C++
ListNode* newNode = new ListNode();
newNode->val = value;
newNode->next = nullptr;
ListNode* tail = head;
while (tail->next != nullptr)
{
tail = tail->next;
}
tail->next = newNode;
```
完整代码:
```C++
#include <iostream>
struct ListNode
{
int val;
ListNode* next;
};
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
ListNode* head = new ListNode();
head->next = nullptr;
// 头插法
for (int i = 0; i < n; i++)
{
ListNode* newNode = new ListNode();
newNode->val = arr[i];
newNode->next = head->next;
head->next = newNode;
}
// 尾插法
/*
ListNode* tail = head;
for (int i = 0; i < n; i++)
{
ListNode* newNode = new ListNode();
newNode->val = arr[i];
newNode->next = nullptr;
tail->next = newNode;
tail = newNode;
}
*/
// 遍历链表
ListNode* p = head->next;
while (p != nullptr)
{
std::cout << p->val << " ";
p = p->next;
}
std::cout << std::endl;
return 0;
}
```
阅读全文