单链表结点图示、重点:
【重点】
- *(p->next) 等同于 p结点的下一个结点;
- p 是指针变量的名字,表示此指针变量指向的 内存地址,
*p 表示此指针指向的 内存地址中存放的内容,
所以,p为变量,代表内存地址,*p为内存地址中的内容;
举个例子来看:
//链表删除操作
Node *temp = T; //建立结点temp,使temp指针变量也指向T的内存
befor->next = T->next; //让befor结点的指针指向结点T的下一个结点,
//也就是让结点befor的下一个结点是结点T的下一个结点
delete temp; //删除temp指针变量指向的内存
1、单链表初始化
注:单链表由头指针唯一指定,整个单链表的操作必须从头指针开始进行。
struct Node
{
int data;
Node *next;
};
Node *head = new Node; //生成头结点
2、单链表遍历,按值查找
从头结点开始依次访问单链表中的所有节点,当head->next为空时遍历结束。
//链表的遍历常用写法
for (Node *p = head->next; p != nullptr; p = p->next)
{//对于指针的初始化以及指针有关的NULL场合,我们尽量使用nullptr替代NULL
if(T->data == x) break;//条件:找到某值时遍历结束
}
对于单链表长度、按位查找都和链表的遍历非常相似,只需要引入新的变量条件即可。
3、插入操作
(1)头插法
基本思想是每次将新申请的结点插在头结点的后面。
由头插法引申的中间插入法:
Node *s;
s->data=x;
s->next=p->next;
p->next=s;//摘链
(2)尾插法
基本思想是每次将新申请的结点插在终端节点的后面。
Node *s;
s->data=x;
r->next=s;
r=s;
r->next=nullptr;//尾结点
4、删除操作
Node *temp = T; //先临时保存结点
befor->next = T->next; //将节点从链表上摘除
delete temp; //从内存中删除结点。
实战
小王子单链表
小王子有一天迷上了排队的游戏,桌子上有标号为1-10按顺序摆放的10个玩具,现在小王子想将它们按自己的喜好进行摆放。小王子每次从中挑选一个好看的玩具放到所有玩具的最前面。 已知他总共挑选了M次,每次选取标号为X的玩具放到最前面,求摆放完成后的玩具标号。给出一组输入,M=8共计排了8次,这8次的序列为 9,3,2,5,6,8,9,8。 求最终玩具的编号序列。
思路:每次按值查找后,保存结点值,头插法插入到头结点后。最后遍历输出。
#include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
Node *head = new Node; //先生成头结点
void init()
{
head->next = nullptr;
//形成空链,由上文已知单链表最后一个结点的指针为空。
for (int i = 10; i >= 1; i--)
{
Node *temp = new Node;
temp->data = i;
temp->next = head->next;
head->next = temp;
}
}
void del(int x)
{
Node *Befor = head;
//用于存放当前节点的前驱,因为单链表单向遍历,我们不能从下一个找到上一个
for (Node *T = head->next; T != nullptr; T = T->next)
//链表的遍历常用写法
{
if (T->data == x) //找到要的那个数了
{
Node *temp = T; //先临时保存结点
Befor->next = T->next; //将节点从链表上摘除
delete temp; //从内存中删除结点。
return; //删除结束后,结束函数。
}
Befor = T; //前驱改变
}
}
void insert(int x)
{
Node *temp = new Node;
temp->data = x;
temp->next = head->next;
head->next = temp;
}
void show(int i)
{
cout << "这是第" << i << "次操作";
//提交代码时删掉这一行
for (Node *T = head->next; T != nullptr; T = T->next)
//链表的遍历常用写法
{
cout << T->data << " ";
}
cout << endl;
}
int main()
{
init();
show(0);//提交代码时删掉这一行
int N;
cin >> N;
for (int i = 1; i <= N; i++)
{
int x;
cin >> x;
del(x);
insert(x);
show(i);
}
}
最近在复习算法,准备蓝桥杯的考试,复习到单链表,有几个小知识点看了很多帖子都不太明白,还是看了数据结构的书才懂,希望能帮到跟我一样问题的人。
最后,如果本文内容有错误的地方,敬请评论告知,教学相长,感激不尽!