野生前端的数据结构基础练习(3)——链表

网上的相关教程非常多,基础知识自行搜索即可。

习题主要选自Orelly出版的《数据结构与算法javascript描述》一书。

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/List

链表的基本知识

  • 特点:

    链表由节点组成,每个节点增加一个对象的引用指向它的后继节点。链表也就是将一个线性表转换为一个存储空间上不连续,而在抽象层面可连续访问的表。

  • 用途:

    更快的插入和删除,因为只需要操作插入删除位置相邻元素即可,如果在线性表中,操作中间位置的元素后,后续的元素位置都需要调整。javascript中的应用例如原型链。

  • 基本属性
    • element当前节点的值
    • next下一个节点
  • 基本方法
    • insert(item, newitem)在item后面插入一个新元素newitem

      插入一个元素,需要将item元素节点的next指向新元素,新元素的next指向item元素的后继元素。

    • remove(pos)从队头删除一个元素

      删除一个节点时,需要将其前驱节点的next指向其后继节点即可。

    • find(element)查询值为element的节点位置
    • findpre(element)查询值为element的节点的前一个节点
    • display()显示整个链表

基本练习

  1. 根据链表的基本特性实现一个LinkedList类,并在后续题目中需要用链表时使用它。

    【注意点】:删除指定元素时,由于需要修改指定元素前一个节点的next指针,所以当所查找的节点存在时,搜索方法应当返回其前一个节点以供后续步骤使用。

  2. 实现一个双向链表TwoWayLinkedList类。

    【注意点】:每一个实例会记录前驱节点和后继节点,双向链表比单链表增加了反向遍历的能力,并且由于所查找节点的属性中包含了前驱和后继节点的信息,故插入节点和删除节点时使用同一个搜索方法即可。

  3. LinkedList类为参考基准,实现一个循环链表CircularLinkedList类。

    【注意点】:循环链表的特点是尾节点的next指针指向了头节点。

课后习题(书中第六节习题)

  1. 实现Advance(n)方法,使节点向前移动n个节点。
  2. 实现back(n)方法,使节点向后移动n个节点。
  3. 实现show()方法,只显示当前节点上的数据。
  4. (略)
  5. (略)
  6. 传说在公元1世纪犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40个同胞被罗马士兵包围,犹太士兵决定宁可自杀也不做俘虏,于是商量出一个自杀方案。他们围成一个圈,从一个人开始,数到第三个人事将第三个人杀死,然后再数,直到杀光所有人,约瑟夫和另一个人决定不参加这个疯狂的游戏,他们快速地计算出两个位置,站在那里得以幸存。写一段将n个人围成一圈,并且第m个人会被杀掉,计算一圈中哪两个人最后会存货,使用循环链表解决该问题。

习题思路

  1. 向前移动n个位置,在位置验证合法时相当于,从原位置删除一个节点,在新位置插入一个节点,为操作方便直接使用双向链表来实现即可。【注意点】:示例代码中直接以放入链表的值为依据进行节点查找,故不支持重复数据,可为节点增加index属性来区分相同数据。

  1. 与上一题原理一致
  2. 简单,不做赘述。
  3. 使用一个单链表来存储输入的成绩即可,当最后一个成绩节点的指针指向null即可。
  4. 用值为1-40的元素循环链表来删除节点直到总节点数目只剩2个为止。为了方便统计剩余元素的数量,为链表增加一个count属性来记录元素个数。

原文地址:https://www.cnblogs.com/dashnowords/p/9747051.html

时间: 2024-11-05 11:55:21

野生前端的数据结构基础练习(3)——链表的相关文章

野生前端的数据结构基础练习(5)——散列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Hash 散列的基本知识 定义 哈希表是一种根据关键码去寻找值的数据映射结构,最直观的应用就是字典(现实的字典,不是数据结构的字典概念). 特点: 插入,删除,取用较快,查找较慢(例如查询最值,需要借助其他数据结构来提升效率). 散列函数应

野生前端的数据结构基础练习(6)——集合

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Set [TOC] 集合的基本知识 定义: 集合Set是一种不包含不同元素的数据结构,主要特性包括无序性和单一性,即集合中的成员是无序的,同时也是不重复的. 基本练习 实现一个自定义的cSet类(避免与原生的Set类冲突),包含以下方法:

野生前端的数据结构基础练习(2)——队列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Queue 队列的基本知识 特点: 先进先出. 用途: 模拟流程或其他带有抽象排队属性的事物或逻辑,例如时间循环队列,发布订阅模式的回调队列等等. 基本方法 enqueue()在队尾插入一个元素 dequeue()从队头删除一个元素 get

野生前端的数据结构基础练习(7)——二叉树

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/btree 一.二叉树的基本知识 基本概念 一棵树最上面的点称为根节点,如果一个节点下面连接多个节点,那么该节点称为父节点,下面的节点称为子节点,二叉树的每一个节点最多有2个子节点,一个节点子节点的个数称为度,二叉树每个节点的度只能是0,1

野生前端的数据结构基础练习(8)——图

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/graph 一.图的基本知识 基本概念 图是由边的集合和点的集合组成的.如果图的边有方向(或者说图中的顶点对是有序的)则成为有向图,如果边没有方向则称为无向图. 基本建模 图可以用来对现实中许多事物进行建模.比如交通流量,计算机网络等. 二

数据结构基础(8) --单链表的设计与实现(1)之基本操作

链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N); 链表的特点: 由于在链表中插入/删除元素都不需要进行数据的移位, 只需要O(1)时间完成, 因此链表适用于频繁插入与删除的情况; 但是链表也有缺点

数据结构基础(9) --单链表的设计与实现(2)之高级操作

链表的链接: 将第二条链表的所有内容链接到第一条链表之后, 其完整实现代码与解析如下: //链表的链接 template <typename Type> void MyList<Type>::concatenate(const MyList<Type> &list) { if (isEmpty())//如果自己的链表为空 { first = list.first; return ; } else if (list.isEmpty()) //如果第二条链表为空 {

数据结构基础(10) --单链表迭代器的设计与实现

为了向 STL 致敬(O(∩_∩)O~), 我们模仿STL中的list的迭代器, 我们也自己实现一个MyList的迭代器, 以供遍历整个链表的所有元素: 首先:Node节点需要做如下修改(注意后缀有+的代码) //链表节点 template <typename Type> class Node { friend class MyList<Type>; friend class ListIterator<Type>; //+ template <typename T

学习java数据结构基础知识之链表

public class Link { public int iData; public double dData; public Link next; public Link(int iData, double dData) { super(); this.iData = iData; this.dData = dData; } public void displayLink(){ System.out.print("{"+iData+","+dData +&qu