单链表有头节点头插法输出
时间: 2024-10-10 18:00:43 浏览: 25
单链表是一种线性的数据结构,它由一系列节点组成,每个节点包含两个部分:数据域和指针域。如果链表有一个特殊的节点作为起始点,我们称之为头节点。头插法就是在链表头部插入新节点的操作。
假设我们要在头节点后插入新的元素,步骤如下:
1. 创建一个新的节点,分配内存并设置其数据字段(通常是你要插入的值)。
2. 将新节点的指针域(next)指向当前的头节点,这将使新节点成为新的头节点。
3. 如果原来的头节点不是空的(即链表非空),更新原头节点的指针,使其指向新的头节点。
4. 链表的新头节点就是刚刚插入的新节点。
如果你想要通过代码展示这个过程,通常会看到类似这样的伪代码或某种编程语言实现:
```python
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
def insert_at_head(head, new_data):
new_node = Node(new_data)
new_node.next = head
return new_node
```
在这个例子中,`head` 是原始链表的头节点,`new_data` 是要插入的数据。函数返回的新节点将成为新的头节点。
相关问题
删除单链表(带头结点,头插入法建立单链表)的第i个结点,代码
以下是删除单链表的第i个结点的代码实现。其中,head为头结点指针,i为待删除结点的位置。
```c++
void deleteNode(ListNode* head, int i) {
ListNode* p = head->next;
ListNode* pre = head;
int j = 1;
while (p && j < i) {
pre = p;
p = p->next;
j++;
}
if (!p || j > i) {
cout << "删除位置无效" << endl;
return;
}
pre->next = p->next;
delete p;
}
```
思路解析:
从头结点的下一个节点开始循环查找,记录当前节点位置和前一个节点位置,直到找到待删除节点或者遍历完整个链表。
如果找到待删除节点,将前一个节点的next指向待删除节点的next,然后删除待删除节点。
如果没有找到待删除节点,说明删除位置无效,直接输出提示信息即可。
采用链接存储结构构建线性表。分别采用前插法和尾部插入方法构建一个含有十个整数的单链表,并对单链表从表头节点开始,输出所有的数据。
在采用链接存储结构构建线性表时,我们使用节点(Node)来表示每个元素,每个节点包含数据部分和指向下一个节点的指针。下面是如何分别采用前插法和尾部插入方法构建一个含有十个整数的单链表,并从表头节点开始输出所有数据:
### 前插法
1. **初始化**:创建一个空链表,即头节点 `head` 为 `null`。
2. **插入过程**:
- 对于每个新插入的元素,创建一个新的节点 `new_node`,将数据赋值给该节点。
- 将 `new_node->next` 指向当前的头节点 `head`。
- 更新头节点 `head` 为 `new_node`。
3. **插入完成**:重复上述步骤直到插入完所有十个整数。
4. **输出数据**:从头节点 `head` 开始,依次访问每个节点并输出其数据,直到当前节点为 `null`。
### 尾部插入方法
1. **初始化**:创建一个空链表,即头节点 `head` 为 `null`。
2. **插入过程**:
- 对于每个新插入的元素,创建一个新的节点 `new_node`,将数据赋值给该节点。
- 如果链表为空(即 `head` 为 `null`),则设置 `head` 为 `new_node`。
- 否则,遍历链表找到最后一个节点(即其 `next` 字段为 `null` 的节点),并将最后一个节点的 `next` 指向 `new_node`。
3. **插入完成**:重复上述步骤直到插入完所有十个整数。
4. **输出数据**:从头节点 `head` 开始,依次访问每个节点并输出其数据,直到当前节点为 `null`。
### 示例代码(假设用C语言实现)
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int value) {
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = value;
new_node->next = NULL;
return new_node;
}
// 前插法插入节点
void insertAtFront(Node** head, int value) {
Node* new_node = createNode(value);
new_node->next = *head;
*head = new_node;
}
// 尾部插入节点
void insertAtEnd(Node** head, int value) {
Node* new_node = createNode(value);
if (*head == NULL) {
*head = new_node;
} else {
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_node;
}
}
// 输出链表数据
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("
");
}
int main() {
Node* head = NULL;
// 使用前插法构建链表
for (int i = 0; i < 10; i++) {
insertAtFront(&head, i + 1);
}
printf("前插法构建的链表: ");
printList(head);
// 使用尾部插入方法构建链表
Node* tail_head = NULL;
for (int i = 0; i < 10; i++) {
insertAtEnd(&tail_head, i + 1);
}
printf("尾部插入方法构建的链表: ");
printList(tail_head);
return 0;
}
```
阅读全文