单链表的操作
数据结构学习中关于链表的基本操作的笔记文档
1.定义单链表
/*创建链表:以整型链表为例*/
struct Node{
int data;
struct Node *next;
};
typedef struct Node LinkListNode;//定义变量名称
2.单链表的基本操作
- 初始化链表
LinkListNode* InitLinkList(){
/*初始化链表*/
LinkListNode* head = new LinkListNode;
head -> next = NULL;
return head;
}
初始化链表其实就是创建了一个头结点,并令其指向NULL。
注意:在链表中,一般情况下,头结点是不储存数据的
- 获得链表第index个数据的值
LinkListNode* GetElement(LinkListNode* head, int index, int &result){
/*获得链表第index个数据:以整型链表为例*/
/*用到了c++的引用代替指针返回result结果*/
int i = 1;
LinkListNode* p = head->next;
while(p){
if(i == index){
break;
}
i++;
p = p->next;
}
result = p->data;
return head;
}
- 单链表的整表删除
LinkListNode* ClearLinkList(LinkListNode* head){
/*单链表的整表删除*/
LinkListNode* p, *q;
p = head->next;
while(p){
/*不能忽略q,q保证1链表在free了每一个节点后,还能找到下一个*/
q = p->next;
delete p;//c++中的释放内存方法
p = q;
}
head->next = NULL;
return head;
}
3.头插法与尾插法
- 头插法
LinkListNode* InverAppendLinkList(LinkListNode* head){
/*链表头插法: 输入一串数字,以-1为结尾,倒序插入链表*/
LinkListNode* newNode;
int i = 1,j = 0;
while(i){
scanf("%d", &j);
if (j != -1){
newNode = new LinkListNode;
newNode->data = j;
newNode->next = head->next;
head->next = newNode;
}
else{
i = 0;
}
}
return head;
}
核心代码:
newNode->next = head -> next;
head->next = newNode;
将新申请的待插入结点指向头指针,再令头指针为该新申请的结点
- 尾插法
LinkListNode* AppendLinkList(LinkListNode* head){
/*链表尾插法:输入一串数字,以-1为结尾,插入链表*/
LinkListNode *newNode, *last;
last = head;
int i = 1,j = 0;
while(i){
scanf("%d", &j);
if(j != -1){
newNode = new LinkListNode;
newNode->data = j;
last->next = newNode;//在尾部加入新节点
last = newNode;//以新节点为新的尾部节点
}
else{
i = 0;
last->next = NULL;
}
}
return head;
}
核心代码:
last->next = newNode;
last = newNode;
将新申请的结点放入链表末尾(让原先的末尾指向它),再令新申请的结点为新的末尾
有时候,以-1为结尾的一串数字放入链表这一操作并不适用,假如我们提前知道待插入数字的长度,可以使用如下方法
LinkListNode* AppendLinkListByList(LinkListNode* head, int length){
/*不通过-1为结尾,尾插法给链表传入数据(确定数据数量)*/
LinkListNode* last, *newNode;
last = head;
int i = 0, j = 0, number = 0;
for(i = 0;i < length; i++){
scanf("%d",&number);
newNode = new LinkListNode;
newNode->data = number;
last->next = newNode;
last = newNode;
}
if(i == length - 1){
last->next = NULL;
}
return head;
}
4.链表的增删操作
- 插入元素
已知待插入位置的前一结点的指针:
LinkListNode* InsertLinkList(LinkListNode* head, LinkListNode* previous, int element){
/*链表插入元素*/
LinkListNode* newNode = new LinkListNode;
newNode->data = element;
newNode->next = previous->next;
previous->next = newNode;
return head;
}
- 删除元素
根据前一结点位置删除:
LinkListNode* DeleteLinkList(LinkListNode* head, LinkListNode* previous){
/*链表删除元素*/
LinkListNode* tail = previous->next;
previous->next = previous->next->next;
free(tail);
return head;
}
根据元素值删除:
LinkListNode* PopLinkList(LinkListNode* head, int index){
/*删除指定位置的元素*/
int i = 1;
LinkListNode* p = head->next;
while(p){
if(i == index-1){
break;
}
i++;
p = p->next;
}//此时p为待删除的节点的前节点
LinkListNode* temp = p->next;
p->next = p->next->next;
free(temp);
return head;
}
- Append操作
在链表末尾加入一个元素:
LinkListNode* Append(LinkListNode* head, int element){
/*在链表尾部插入一个元素*/
LinkListNode* newNode = new LinkListNode;
newNode->data = element;
LinkListNode* tail = head->next;
while(tail){
tail = tail->next;
}
tail->next = newNode;
tail = newNode;
return head;
}