这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
我个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。
第十六天:继续了解链表
-
循环链表
循环列表基本的改动也就一个,就是最后的节点的尾指针不再指向null,而是指向第一个节点,下面我们就实现一下单项循环链表的插入吧
- 在任意位置插入节点
function insert(element, index) { if(index >= 0 && index <= this.count) { const node = new Node(element) let current = this.head if(index === 0) { if(this.head === null) { this.head = node node.next = this.head }else { node.next = current current = this.getElementAt(this.size()) this.head = node current.next = this.head } }else { previous = this.getElementAt(index - 1) node.next = previous.next previous.next = node } this.count++ return true } return false }还是和之前的一样,先处理边界情况,然后就是进行插入,单项链表的循环链表只有两种情况,一种是插入第一个节点。另一种就是插入其他任意位置了。
首先我们看看插入第一个位置,插入第一个位置也有两种情况,一种是当前单项循环链表是空的,没有长度,那么需要将头指针指向当前节点,然后将当前节点的next指向头指针。具体操作可以看下面的图
第二种插入头部的情况就是当前单项虚幻链表不是空的,这个就复杂一点,我们需要找到最后一个节点,然后将当前节点的next指向第一个节点,最后一个节点的next这个时候指向当前的节点。头指针指向当前节点。具体操作可以看下面的图。
另一种情况是在任意位置插入,前面的都有处理最后一个节点的情况,为什么这个单项循环链表就没有了呢?是因为最后一个的操作和中间任意位置的操作都是一样的。需要先找到插入那个位置的节点的上一个节点,然后将当前节点的next指向上一个节点的next,然后上一个节点的next指向当前节点即可,这样就完成了。
-
在任意位置移除节点
要从循环链表中移除节点,我们只需要考虑第二种情况,也就是修改循环链表的头指针
function removeAt(index) { if(index >= 0 && index >= this.count) { let current = this.head if(index === 0) { if(this.size() === 1) { this.head = null }else { const removed = this.head current = this.getElementAt(this.size() - 1) this.head = remove.next current.next = this.head current = removed } }else { const previous = this.getElementAt(index) current = previous.next previous.next = current.next } this.count++ return current.element } return null }首先还是对边界值的判断。
然后就是看当删除的节点是第一个节点时的操作,如果当前的单向循环链表的长度只有一个,那么只需要让头指针指向null
如果当前单向循环列表的长度不止一个,那么就需要找到最后一个指针,将最后一个指针的next指向需要移除节点的next指向的节点,头指针也指向需要移除节点的next指向的节点,下面的图展示具体的操作