链表是由一系列节点组成的线性结构,每个节点包括两个部分:存储空间元素和下一个节点地址的指针。

链表的元素个数不受限制,添加元素时存储个数会随之改变。
链表的有点在于确定大小,插入和删除元素都是相当方便;但缺点是不能随机访问。
在链表中会有一个头指针变量,这个变量可以用来找到这个链表,头指针指向的是第一个节点。
- struct ListNode
- {
- int val;
- struct ListNode* next;
- ListNode(int x):
- val(x);
- next(NULL){}
- };
- 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;
- }
只需要每次判断当前是不是空指针,然后输出当前值并指向下一位即可。
- ListNode *m=head;
- while (m!=nullptr)//nullprt:空指针
- {
- cout<
val< - 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