一、简介
链表是由一系列节点组成的线性结构,每个节点包括两个部分:存储空间元素和下一个节点地址的指针。
链表的元素个数不受限制,添加元素时存储个数会随之改变。
链表的有点在于确定大小,插入和删除元素都是相当方便;但缺点是不能随机访问。
在链表中会有一个头指针变量,这个变量可以用来找到这个链表,头指针指向的是第一个节点。
二、创建
1、声明
struct ListNode
{
int val;
struct ListNode* next;
ListNode(int x):
val(x);
next(NULL){}
};
2、创建
- 创建head节点,并将该节点指向头节点;
- 创建下一个节点q,并将当前节点p指向q;
- 节点p向后移一位。
int num;
cin>>num;
ListNode *head=new ListNode(num);
ListNode *p=head;
while(cin>>num){
ListNode*q=new ListNode(num);
p->next=q;
p=p->next;
}
三、基本操作
1、遍历
只需要每次判断当前是不是空指针,然后输出当前值并指向下一位即可。
ListNode *m=head;
while (m!=nullptr)//nullprt:空指针
{
cout<<m->val<<endl;
m=m->next;
}
2、插入
- 首先判断现在的链表是不是空的,如果是,那么头节点就指向现在新增的节点;
- 如果不是空的,那就在链表的尾部插入新节点即可。
ListNode* insertNode(ListNode* head,int data){
ListNode *newNode=new ListNode(data);
ListNode *p=head;
if (p==nullptr){
head=newNode;
}
else
{
while (p->next!=nullptr)
{
p=p->next;
}
p->next=newNode;
}
return head;
}
3、删除
- 首先判断是不是空节点,如果是,那就不用执行了;
- 判断是不是删除头节点,如果是,那么头节点head要先指向下一位,避免找不到链表;
- 如果有该节点,那就遍历到它的前一个节点;
- 如果没有找到该节点,那就不用执行了;
- 否则进行delete。
ListNode *deleteNode(ListNode* head, int data)
{
ListNode *p=head;
if (p==nullptr)
{
return head;
}
else
{
if (p->val==data)
{
head=p->next;
delete p;
return head;
}
else
{
while(p->next!=nullptr&&p->next->val!=data)
{
p=p->next;
}
if(p->next==nullptr)
{
return head;
}
else
{
ListNode *deleteNode=p->next;
p->next=deleteNode->next;
delete deleteNode;
return head;
}
}
}
}
4、查询指定的节点
- 查询与遍历很像;
- 首先,判断当前指针是不是NULL;
- 然后,判断是不是与目标相等,如果相等,就返回当前节点;
- 继续下一个节点。
struct Node *FindNode(int a)
{
struct Node *temp=head;
while(temp!=NULL)
{
if(a==temp->a)
{
return temp;
}
temp=temp->next;
}
return NULL;
}
5、清空
- 一个一个释放当前节点,最后实现全部释放。
void FreeList()
{
struct Node *temp=head;
while(temp!=NULL)
{
struct Node *pt=temp;
temp=temp->next;
free(pt);
}
head=NULL;
end=NULL;
}
以上就是本文的全部内容啦!
参考文献:https://blog.csdn.net/Forever_wj/article/details/107517451