单向循环链表

链表结构:

与单向链表区别之处在于单向链表的最后的结点的指针域 next 是设置为null. 但是单向循环链表最后一个结点是重新指向它的第一个首元结点的位置。


结构体设计:

与单向链表在结构设计上,是一致的.不需要做额外的调整. 虽然修改为单向循环链表,但是总体来说还是单向的。

typedef struct Node{

    ElemType data;

    struct Node *next;

}Node;

typedef struct Node * LinkList;


链表的创建:

在实现单向链表的创建时,需要考虑.你进行创建新增结点时的2种情况

第一种情况: 第一次创建; 第二种情况: 链表已经创建成功,并且已经存储了相应的结点. 需要在链表的末尾继续新增数据;


插入数据:

在往一个单向循环链表中插入数据,需要提前分析2种情况.

第一种情况,则是插入的位置在首元结点上;

第二种情况,插入其他位置(包括链表中间/末尾);


单向循环链表插入情况(首元结点位置):

判断输入的位置是否是place = 1;

创建新的结点temp,并且做出合理的健壮性判断;以及赋值

将新创建的结点temp 的next 指向原始的首元结点 A 的位置

通过循环找到链表最后一个尾结点,将尾结点的next 指针域指向 新创建的结点 temp.

由于链表的首元结点,通过插入发生了改变,所以此时将*L 指向新的首元结点 temp


单向循环链表插入情况(其他位置):

判断输入的位置是否是place = 1;

创建新的结点temp,并且做出合理的健壮性判断;以及赋值;

通过循环找到待插入的位置前一个结点 p ;

将新创建的结点 temp 指向 p->next;

将待插入结点的前一个结点 P 与新结点  temp 之间连接起来;


链表的删除:

在实现单向链表的创建时,需要考虑.你进行创建新增结点时的3种情况

第一种情况: 删除的位置在首元结点上;

第二种情况: 删除时,当链表只剩下最后一个结点时;

第三种情况: 删除其他位置上的结点;


参考链接:https://juejin.im/post/5e8584c4f265da480a1aa448

你可能感兴趣的:(单向循环链表)