网上的相关教程很是多,基础知识自行搜索便可。javascript
习题主要选自Orelly出版的《数据结构与算法javascript描述》一书。java
参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Listgit
特色:github
链表由节点组成,每一个节点增长一个对象的引用指向它的后继节点。链表
也就是将一个线性表转换为一个存储空间上不连续,而在抽象层面可连续访问的表。算法
用途:数据结构
更快的插入和删除,由于只须要操做插入删除位置相邻元素便可,若是在线性表中,操做中间位置的元素后,后续的元素位置都须要调整。javascript中的应用例如原型链。指针
基本属性code
element
当前节点的值next
下一个节点基本方法对象
insert(item, newitem)
在item后面插入一个新元素newitemblog
插入一个元素,须要将item元素节点的next
指向新元素,新元素的next
指向item元素的后继元素。
remove(pos)
从队头删除一个元素
删除一个节点时,须要将其前驱节点的next
指向其后继节点便可。
find(element)
查询值为element的节点位置
findpre(element)
查询值为element的节点的前一个节点
display()
显示整个链表
根据链表的基本特性实现一个LinkedList
类,并在后续题目中须要用链表时使用它。
【注意点】:删除指定元素时,因为须要修改指定元素前一个节点的next
指针,因此当所查找的节点存在时,搜索方法应当返回其前一个节点以供后续步骤使用。
实现一个双向链表TwoWayLinkedList
类。
【注意点】:每个实例会记录前驱节点和后继节点,双向链表比单链表增长了反向遍历的能力,而且因为所查找节点的属性中包含了前驱和后继节点的信息,故插入节点和删除节点时使用同一个搜索方法便可。
以LinkedList
类为参考基准,实现一个循环链表CircularLinkedList
类。
【注意点】:循环链表的特色是尾节点的next指针指向了头节点。
Advance(n)
方法,使节点向前移动n个节点。back(n)
方法,使节点向后移动n个节点。show()
方法,只显示当前节点上的数据。n
个位置,在位置验证合法时至关于,从原位置删除一个节点,在新位置插入一个节点,为操做方便直接使用双向链表来实现便可。【注意点】:示例代码中直接以放入链表的值为依据进行节点查找,故不支持重复数据,可为节点增长index
属性来区分相同数据。与上一题原理一致
简单,不作赘述。
使用一个单链表来存储输入的成绩便可,当最后一个成绩节点的指针指向null
便可。
用值为1-40的元素循环链表来删除节点直到总节点数目只剩2个为止。为了方便统计剩余元素的数量,为链表增长一个count
属性来记录元素个数。