小白的数据结构与算法学习笔记(八)----循环链表及其相关操作

前一章我们讲了静态链表,用数组来描述链表,这一章来看看循环链表。

循环链表是啥呢?前面我们讲了单链表,知道单链表每个结点有两个域,一个数据域存放数据元素的信息,一个指针域存放下一个结点的地址,而且最后一个结点也就是终端结点的指针域为NULL,这样一来,我们只能一个劲的往后访问,却无法回头。简单来说,就是只能访问后继,无法访问前驱,并且如果不是从第一个结点开始访问的话,无法遍历所有结点,为了解决这个问题,我们就有了循环链表,所以说需求带动进步。循环链表一般指单循环链表,就是将单链表中终端结点的指针域中存放的空指针改为指向第一个结点!!这样就好像形成了一个环,故名曰循环链表。在以下讨论中,头指针为head,尾指针为rear。

循环链表中不存在NULL指针,所以判断循环链表是空表的条件是:head->next==head;rear==rear->next;

对比一下单链表是空表的条件是:head->next==NULL。

接下来我们来看看循环链表的相关操作:

1、根据所给数据值,返回结点位置

简单来说,就是设置计数变量,通过循环遍历直到找到目标结点,返回计数变量。

这里写一下循环部分的代码:

//target为遍历用的指针,初始化为第一个结点,pnode为第一个结点,elem是提供的数据值,i为计数变量。

for(target=pnode;target->next!=pnode&&target->data!=elem;i++)

{

         target=target->next;

}

2、删除指定位置的结点

关键还是遍历,前面我们接触过不少删除操作,说白了就是“绕开”法,所以我们需要遍历到指定位置的前一个结点!而不是指定位置的结点!!

由于循环链表的特殊性,这里需要分情况:

A、当删除结点为第一个结点时:

第一个结点前一个就是尾结点,即遍历直到:target->next==pnode,然后本来是要直接开始“绕开”操作,但是由于是第一个结点,我们还需要进行第一个结点的身份更替,也就是让下一个结点当第一个结点,毕竟这个位置也是链表开始的位置,不可或缺:temp=pnode;pnode=temp->next;(pnode始终为第一个结点名)。好了,可以开始绕开了,target->next=pnode;(此时pnode已经是新任第一个结点了)。最后不要忘记释放空间:free(temp)

B、当删除结点不是第一个结点时:

遍历到该结点前一个结点,直接开始绕开操作:temp=target->next;target->next=temp->next;释放空间:free(temp),搞定

3、在指定位置插入结点

关键还是遍历到指定位置前一个结点,开始插入操作,插入基本思想与前面几章的插入思想相同。但是由于是循环链表,还是需要分情况讨论:

A、当在第一个结点前插入时:

找到尾结点,假设尾节点为target,插入结点名为temp,temp->data=item,初始化数据域。temp->next=pnode;target->next=temp;pnode=temp(插入以及第一个结点身份更替)

B、当插入位置不是第一个位置前时:

遍历到该结点前一个结点,设为target,直接插入即可:temp->next=taget->next;target->next=temp;

最后我们来简单介绍一下尾指针rear,顾名思义,就是指向最后一个结点的指针。大家想一下,如果是单链表,只有一个头指针,指向第一个结点,想要访问最后一个结点,只能一个一个往后找,时间复杂度为O(n),如果是循环链表中的尾指针就不同了,rear->next就是最后一个结点,rear->next->next就是第一个结点,时间复杂度都是O(1)。

4、利用循环链表连接两个线性表

如果用单链表实现这个操作,显然必须遍历到第一个链表的最后一个元素,时间复杂度为O(n),可是如果应用循环链表中的尾指针,效果就相当好了,只需要改变两个链表尾指针的指向即可,时间复杂度为O(1)。假设两个表的尾结点分别为A,B:

LinkList p=A->next;

A->next=B->next->next;

free(B->next);

B->next=p;

下一章,我们将会讲解线性表中最后一个内容——双向链表。

                                                                                                                                          BY  ZJQ

猜你喜欢

转载自blog.csdn.net/qq_41641805/article/details/81409468
今日推荐