• 数据结构(一) 单链表的实现


          数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺。加油。珍惜校园中自由学习的时光。按照链表、栈、队列、排序、数组、树这种顺序来学习数据结构这门课程把。

                                -WH

    一、单链表的概念

          链表是最基本的数据结构,其存储的你原理图如下图所示

              

          上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。

          链表有很多种,比如单链表,双链表等等。我们就对单链表进行学习,其他的懂了原理其实是一样的。

    二、用java实现单链表

          语言只是一种工具,数据结构真正体会的是那种思想,这句话确实是这样,不管用什么写,其思想是不改变的。以前使用的是C++,现在用的是java,一步步来实现。

          2.1、编写一个Node类来充当结点的模型。我们知道,其中有两个属性,1存放数据的data,2存放下一结点的引用,

              

     View Code

          2.2、单链表的简单操作(增加,删除,获取总长度,链表元素排序,链表遍历)  

                

             2.2.1、增加结点操作,addNode(Node)

                 

               想法:    一开始也会想如果什么结点也没有。是不是需要判断插入的是第一个结点的问题,但写完后发现没有必要,是不是第一个结点操作都是一样的,所以通过移动的指针遍历整个链表,找到最后一个结点,往后添加即可。没难度。      

     View Code

             2.2.2、插入结点到链表的指定位置。 insertNodeByIndex(int index,Node node)

                  

                注意:要知道插入操作需要的前提是什么,你才好写代码,写完之后,考虑如果在特殊位置上插入,是否也一样。还有需要进行插入位置是否可行的判断。

     View Code

             2.2.3、删除指定位置上的结点  delNodeByIndex(int index)

                  

     View Code

              2.2.4、单链表进行选择排序  selectSortNode()  

                    前提要知道什么是选择排序,如果不会,请查看我讲解排序的文章

                  

                  分析

                  

     View Code

              2.2.5、单链表进行插入排序  insertSortNode()

                  前提:要知道什么是插入排序。这个使用插入排序写了我好久,懵逼一样的状态,并且我认为我自己写效率不是很高。不管怎样,是骡子是马拿出来溜溜

                  

                  

     View Code

        

              2.2.6、当然还可以使用冒泡排序、归并排序,等等等,都可以自己去尝试,我就不写了。如果不懂这些排序,那么就看我写排序的文章把。

              2.2.7、计算单链表的长度

                  

     View Code

              2.2.8、遍历单链表,打印data

                    

     

     View Code

      

    三、总结

        基本的单链表操作就是上面这些了,自己完全手动写一写,会对单链表这种数据结构的理解有很大的帮助。当然其中比较难的是在于对链表的排序上,说难也不难,只要懂的几种排序的原理,就跟写伪代码一样,去实现即可。这里还有一些操作,大家可以动手做一做,我会在下一篇文章中讲解这些答案。

        3.1、如何从链表中删除重复数据

        3.2、如何找出单链表中的倒数第k个元素

        3.3、如何实现链表的反转

        3.4、如何从尾到头输出单链表

        3.5、如何寻找单链表的中间结点

        3.6、如何检测一个链表是否有环

        3.7、如何在不知道头结点的情况下删除指定结点

        3.8、如何判断两个链表是否相交

      

                 

  • 相关阅读:
    2012 Multi-University #8
    2016"百度之星"
    Codeforces Round #352 (Div. 2)
    数位DP CF 55D Beautiful numbers
    数位DP GYM 100827 E Hill Number
    2012 Multi-University #9
    2012 Multi-University #10
    java生成指定范围的随机数
    MySql查询时间段的方法
    eclipse报错GC overhead limit exceed,卡顿
  • 原文地址:https://www.cnblogs.com/shitaotao/p/7653210.html
Copyright © 2020-2023  润新知