c语言编程删除单链表带头结点,头插入法建立单链表的第i个结点
时间: 2024-09-25 22:12:01 浏览: 47
链表-使用C语言实现带头结点的单链表.zip
在C语言中,删除单链表的带头结点通常涉及两个步骤:首先,找到并更新新的头结点,然后释放原头结点的数据域。假设链表结构如下:
```c
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
```
1. **删除第一个节点** (即新头结点):
- 如果链表为空,直接返回;
- 否则,将当前头结点的`next`指向原来的第二个节点。
```c
ListNode* deleteHead(ListNode* head) {
if (head == NULL || head->next == NULL) {
return NULL;
}
ListNode* new_head = head->next;
free(head); // 释放头结点内存
return new_head;
}
```
2. **创建第i个节点并将其插入到链表头部** (头插入法):
- 需要预先有一个指针指向第i-1个节点,然后创建一个新的节点,设置其数据、指向前一个节点,并将前一个节点的`next`指向新节点。
```c
void insertAtHead(ListNode** head_ref, int i, int data) {
if (i <= 0) {
printf("Invalid index.");
return;
}
// 创建新节点
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = data;
newNode->next = *head_ref; // 新节点的`next`初始指向旧头结点
// 将第i-1个节点的`next`指向前一个节点
ListNode* temp = *head_ref;
for (int j = 0; j < i - 1 && temp != NULL; ++j) {
temp = temp->next;
}
if (temp == NULL) {
printf("Index out of range.");
return;
}
temp->next = newNode;
// 更新头结点
*head_ref = newNode;
}
```
阅读全文