新学链表——单链表的头插法与尾插法
上代码示例
//头插法
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构
struct Node {
int data;
struct Node* next;
};
// 插入节点到链表头部
void insertAtBeginning(struct Node** head_ref, int new_data) {
// 分配内存给新节点
struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));//给新节点开辟空间
// 设置新节点的数据
new_node->data = new_data;//存储新数据
// 将原链表的头部作为新节点的下一个节点
new_node->next = *head_ref;//存入上一个指针的地址,该地址存在指针head的地址上,相当于找到存head的地方,该位置保持不变,更改该位置存的地址,即保持仓库不变,更改仓库里的货物
// 更新链表头指针为新节点
*head_ref = new_node;//更改仓库里的货物,将第一个节点的指针存到head,将head指向的NULL留给最后一个节点
}
// 打印链表内容
void printList(struct Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 初始化链表为空
struct Node* head = NULL;
// 插入一些节点到链表中
insertAtBeginning(&head, 6);//逆序存入
insertAtBeginning(&head, 4);
insertAtBeginning(&head, 2);
// 打印链表内容
printf("Linked list: ");
printList(head);
return 0;
}
当我想要写一个链表时,正常的思维应该是从头节点顺序往下,依次赋值,在尾节点需要赋一个空指针作为下一个节点的指针,来终止节点。
头插法是反向思考,先设置一个头节点,将第一个数据存到第一个节点,同时第一个数据的节点指针next存head的地址,然后通过二级指针修改head的内容为新节点的指针。
//尾插法
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构
struct Node {
int data;
struct Node* next;
};
// 在链表末尾插入节点
void appendNode(struct Node** head_ref, int new_data) {
// 分配内存给新节点
struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = NULL;//将新节点视为链表最后一个节点,指向空指针,此步骤移至最后一行可能更合逻辑
// 如果链表为空,则新节点成为头节点
if (*head_ref == NULL) {
*head_ref = new_node;
return;
}
// 找到链表的最后一个节点
struct Node* last = *head_ref;
while (last->next != NULL) {
last = last->next;
}
// 将新节点链接到链表的最后
last->next = new_node;//将新节点并入原链表
}
// 打印链表内容
void printList(struct Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
struct Node* head = NULL;
// 在链表末尾插入节点
appendNode(&head, 2);
appendNode(&head, 4);
appendNode(&head, 6);
// 打印链表内容
printf("Linked list: ");
printList(head);
return 0;
}
尾插法就是在函数头节点置空,将要加入的新节点指向这个空节点,然后找到原链表的最后一个节点(原指向一个空节点),将其指向这个新节点,这个新节点成为了新链表的最后一个节点,指向一个空节点。
由此可见,尾插法在逻辑上就是按照线性表的顺序将新节点插入到最后一个位置,即逻辑顺序与线性表顺序一致,for example 要输入的数据是1 2 3 4 5,最后在链表中呈现的数据是1->2->3->4->5->NULL;
头插法就是尾插法的反向,输入1 2 3 4 5,呈现出来的是NULL<-1<-2<-3<-4<-5。
在输入字符串转换成数字可能头插法更好用?