单项循环链表的应用与原理
思考:对于单向链表而言,想要遍历链表,则必须从链表的首结点开始进行遍历,请问有没有更简单的方案实现链表中的数据的增删改查?
回答:是有的,可以使用单向循环的链表进行设计,单向循环的链表的使用规则和普通的单向链表没有较大的区别,需要注意:单向循环链表的尾结点的指针域中必须指向链表的首结点的地址,由于带头结点的单向循环链表更加容易进行管理,所以以带头结点的为例:
上图所示的就是一个典型的单向循环链表的结构,可以发现单向循环链表的结构属于环形结构,链表中的最后一个结点的指针域中存储的是链表的第一个结点的地址。
为了管理单向循环链表,需要构造头结点的数据类型以及构造有效结点的数据类型,如下:
(1) 创建一个空链表,由于是使用头结点,所以就需要申请头结点的堆内存并初始化即可!
(2) 创建新结点,为新结点申请堆内存并对新结点的数据域和指针域进行初始化,操作如下:
(3) 根据情况把新结点插入到链表中,此时可以分为尾部插入、头部插入、指定位置插入:
头插
尾插
中插
(4) 根据情况可以从链表中删除某结点,此时可以分为尾部删除、头部删除、指定元素删除:
头删
尾删
中删
双向链表的原理与应用
如果想要提高单向链表或者单向循环链表的访问速度,则可以在链表中的结点中再添加一个指针域,让新添加的指针域指向当前结点的直接前驱的地址,也就意味着一个结点中有两个指针域(prev + next),也被称为双向链表(Double Linked List)。
由于带头结点更加方便用户进行数据访问,所以本次创建一条带头结点的双向不循环的链表。
(1) 创建一个空链表,由于是使用头结点,所以就需要申请头结点的堆内存并初始化即可!
(2) 创建新结点,为新结点申请堆内存并对新结点的数据域和指针域进行初始化,操作如下:
(3) 根据情况可以从链表中插入新结点,此时可以分为尾部插入、头部插入、指定位置插入:
(4) 根据情况可以从链表中删除某结点,此时可以分为尾部删除、头部删除、指定结点删除:
双向循环链表与双向链表的区别:指的是双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。
由于带头结点更加方便用户进行数据访问,所以本次创建一条带头结点的双向循环的链表。
(1) 创建一个空链表,由于是使用头结点,所以就需要申请头结点的堆内存并初始化即可!
(2) 创建新结点,为新结点申请堆内存并对新结点的数据域和指针域进行初始化,操作如下:
(3) 根据情况可以从链表中插入新结点,此时可以分为尾部插入、头部插入、指定位置插入:
(4) 根据情况可以从链表中删除某结点,此时可以分为尾部删除、头部删除、指定结点删除: