zoukankan      html  css  js  c++  java
  • 野生前端的数据结构基础练习(3)——链表

    1354575-20181006120530529-2002646224.jpg

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

    习题主要选自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属性来区分相同数据。

    1354575-20181006120545210-718046487.png

    1. 与上一题原理一致

    2. 简单,不做赘述。

    3. 使用一个单链表来存储输入的成绩即可,当最后一个成绩节点的指针指向null即可。

    4. 用值为1-40的元素循环链表来删除节点直到总节点数目只剩2个为止。为了方便统计剩余元素的数量,为链表增加一个count属性来记录元素个数。
      1354575-20181006120557903-2075402660.png

    转载于:https://www.cnblogs.com/dashnowords/p/9747051.html

  • 相关阅读:
    (Java实现) 有重复元素排列问题
    玩转Google开源C++单元测试框架Google Test系列(转载)
    C++11之后,对源代码增加了UTF8和UCS4的支持(Windows内部使用Unicode,因为nt内核用的是ucs2,那是89年,utf8到了92年才发明出来)
    当年写的俄罗斯方块(现在更喜欢研究别人的代码)
    Stack的三种含义(数据超过栈的大小,就发生stack overflow)
    64位平台C/C++开发注意事项(转载)
    Redis集群方案
    Hadoop处理大量小文件的问题和解决方法
    Lazy Scheduler
    Solr与MongoDB集成,实时增量索引
  • 原文地址:https://www.cnblogs.com/twodog/p/12135842.html
Copyright © 2011-2022 走看看