单链表的头插法和尾插法
1. 单链表的插入操作
在单链表中插入节点是常见的操作之一。插入操作可以分为两种主要方式:头插法和尾插法。此外,还可以根据指定位置进行插入。
1.1 头插法
定义:每次插入操作都在链表的头部进行,即在头节点的下一个位置插入新节点。
特征:
- 插入位置始终是
0。 - 插入顺序与链表的最终顺序相反。
代码示例:
void InsertHead(ListNode** L, int v) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = v;
newNode->next = *L; // 新节点的next指向当前头节点
*L = newNode; // 修改头指针,使其指向新节点
}
调用示例:
这里L可以写成L1等其他名字
ListNode* L = NULL;
InsertHead(&L, 10); // 插入10
InsertHead(&L, 20); // 插入20
InsertHead(&L, 30); // 插入30
结果:
链表的顺序为 30 -> 20 -> 10。
1.2 尾插法
定义:每次插入操作都在链表的尾部进行,即在链表的最后一个节点的next位置插入新节点。
特征:
- 插入位置始终是链表的当前长度。
- 插入顺序与链表的最终顺序一致。
代码示例:
void InsertTail(ListNode** L, int v) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = v;
newNode->next = NULL;
if (*L == NULL) {
*L = newNode; // 如果链表为空,新节点成为头节点
}
else {
ListNode* current = *L;
while (current->next != NULL) {
current = current->next; // 找到链表的最后一个节点
}
current->next = newNode; // 将新节点插入到链表的尾部
}
}
下面给一个完整的可操作的代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct ListNode{
int val;
struct ListNode* next;
}ListNode;
void printList(ListNode* L){
ListNode* cur=L;
while(cur!=NULL){
printf("%d ",cur->val);
cur=cur->next;
}
printf("\n");
}
void InsertHead(ListNode** L,int v){
ListNode* newNode=(ListNode*)malloc(sizeof(ListNode));
newNode->val=v;
newNode->next=*L;
*L=newNode;
}
void InsertTail(ListNode** L,int v){
//如果这个是空链表,说明L==NULL
if(*L==NULL){
ListNode* node=(ListNode*)malloc(sizeof(ListNode));
*L=node;
(*L)->val=v;
(*L)->next=NULL;
return;
}
//找到尾节点
//尾结点的next指向NULL
//定义一个指针 cur->next==NULL,说明cur指向最后一个节点
ListNode* cur=*L;
while(cur->next!=NULL){
cur=cur->next;
}
//此时在最后一个节点
//先定义一个节点
ListNode* newNode=(ListNode*)malloc(sizeof(ListNode)) ;
newNode->val=v;
newNode->next=NULL;//新节点的next指向NULL
cur->next=newNode;
}
int main(){
ListNode* L1=NULL;
//尾插法
InsertTail(&L1,0);
InsertTail(&L1,10);
InsertTail(&L1,20);
printList(L1); //0,10,20
//尾插法不会打乱顺序
//头插法
InsertHead(&L1,10);
InsertHead(&L1,20);
printList(L1); //20,10,0,10,20
//头插法会逆序
return 0;
}

被折叠的 条评论
为什么被折叠?



