链表的结构:

链表在空间是不连续的,包括:

  • 数据域(用于存储数据)
  • 指针域(用于存储下一个node的指针)

单项链表的代码实现:

节点类

  • 构造函数
  • 数据域的get,set方法
  • 指针域的get,set方法

代码:

  1. public class Node {
  2. Object element; //数据域
  3. Node next; //指针域
  4. //构造方法
  5. public Node(Object obj, Node nextval) {
  6. this.element = obj;
  7. this.next = nextval;
  8. }
  9. //获得当前结点的指针域
  10. public Node getNext() {
  11. return this.next;
  12. }
  13. //获得当前结点数据域的值
  14. public Object getElement() {
  15. return this.element;
  16. }
  17. //设置当前结点的指针域
  18. public void setNext(Node nextval) {
  19. this.next = nextval;
  20. }
  21. //设置当前结点数据域的值
  22. public void setElement(Object obj) {
  23. this.element = obj;
  24. }
  25. public String toString() {
  26. return this.element.toString();
  27. }
  28. }

list类的接口实现代码:(其中把Node作为内部类了)

  1. public interface ListForTest {
  2. //获得线性表长度
  3. public int size();
  4. //判断线性表是否为空
  5. public boolean isEmpty();
  6. //插入元素
  7. public void insert(int index, Object obj) throws Exception;
  8. //删除元素
  9. public void delete(int index) throws Exception;
  10. //获取指定位置的元素
  11. public Object get(int index) throws Exception;
  12. }

list的实现类代码:

  1. public class TextList implements ListForTest{
  2. Node head; //头指针
  3. Node current;//当前指针
  4. int size;//数量
  5. //构造函数
  6. public TextList(){
  7. head = new Node(null,null);
  8. current = head;
  9. this.size = 0;
  10. }
  11. //当前索引函数
  12. public void index(int index) throws Exception
  13. {
  14. if(index <0 || index > size -1)
  15. {
  16. throw new Exception("参数错误!");
  17. }
  18. int j=0;//循环变量
  19. while(current != null&&j<index)
  20. {
  21. current = current.next;
  22. j++;
  23. }
  24. }
  25. public int size() {
  26. // TODO Auto-generated method stub
  27. return this.size;
  28. }
  29. public boolean isEmpty() {
  30. // TODO Auto-generated method stub
  31. return this.size == 0;
  32. }
  33. public void insert(int index, Object obj) throws Exception {
  34. // TODO Auto-generated method stub
  35. if(index <0 ||index >size)
  36. {
  37. throw new Exception("参数错误!");
  38. }
  39. if(index == 0){
  40. Node node = new Node(obj,head);
  41. head = node;
  42. }else{
  43. index(index-1);//定位到要操作结点的前一个结点对象。
  44. current.setNext(new Node(obj,current.next));
  45. }
  46. size++;
  47. }
  48. public void delete(int index) throws Exception {
  49. // TODO Auto-generated method stub
  50. //判断链表是否为空
  51. if(isEmpty())
  52. {
  53. throw new Exception("链表为空,无法删除!");
  54. }
  55. if(index <1 ||index >size)
  56. {
  57. throw new Exception("参数错误!");
  58. }
  59. if(index == 0){
  60. head = head.next;
  61. }else{
  62. index(index-1);//定位到要操作结点的前一个结点对象。
  63. current.setNext(current.next.next);
  64. }
  65. size--;
  66. }
  67. public Object get(int index) throws Exception {
  68. // TODO Auto-generated method stub
  69. if(index <0 || index >size-1)
  70. {
  71. throw new Exception("参数非法!");
  72. }
  73. index(index);
  74. return current.getElement();
  75. }
  76. public class Node {
  77. Object element; //数据域
  78. Node next; //指针域
  79. //构造方法
  80. public Node(Object obj, Node nextval) {
  81. this.element = obj;
  82. this.next = nextval;
  83. }
  84. //获得当前结点的指针域
  85. public Node getNext() {
  86. return this.next;
  87. }
  88. //获得当前结点数据域的值
  89. public Object getElement() {
  90. return this.element;
  91. }
  92. //设置当前结点的指针域
  93. public void setNext(Node nextval) {
  94. this.next = nextval;
  95. }
  96. //设置当前结点数据域的值
  97. public void setElement(Object obj) {
  98. this.element = obj;
  99. }
  100. public String toString() {
  101. return this.element.toString();
  102. }
  103. }
  104. }

单链表的效率分析:

在单链表的任何位置上插入数据元素的概率相等时,在单链表中插入一个数据元素时比较数据元素的平均次数为:

删除单链表的一个数据元素时比较数据元素的平均次数为:

因此,单链表插入和删除操作的时间复杂度均为O(n)。另外,单链表读取数据元素操作的时间复杂度也为O(n)。

顺序表和单链表的比较:

顺序表

优点:主要优点是支持随机读取,以及内存空间利用效率高;

  缺点:主要缺点是需要预先给出数组的最大数据元素个数,而这通常很难准确作到。当实际的数据元素个数超过了预先给出的个数,会发生异常。另外,顺序表插入和删除操作时需要移动较多的数据元素。

链表

优点:主要优点是不需要预先给出数据元素的最大个数。另外,单链表插入和删除操作时不需要移动数据元素;

  缺点:主要缺点是每个结点中要有一个指针,因此单链表的空间利用率略低于顺序表的。另外,单链表不支持随机读取,单链表取数据元素操作的时间复杂度为O(n);而顺序表支持随机读取,顺序表取数据元素操作的时间复杂度为O(1)。

面试之路(10)-BAT面试之java实现单链表的插入和删除的更多相关文章

  1. 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】

    本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...

  2. 数据结构Java实现03----单向链表的插入和删除

    文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定)            概念: 链式存储结构是基于指针实现的.我们把一个数据 ...

  3. 数据结构Java实现02----单向链表的插入和删除

    文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定)            概念: 链式存储结构是基于指针实现的.我们把一个数据 ...

  4. JAVA数据结构——单链表

    链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...

  5. 使用java实现单链表(转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html)

    使用java实现单链表----(java中的引用就是指针)转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html ? 1 2 3 4 5 6 7 ...

  6. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  7. java实现单链表的增删功能

    JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...

  8. python经典面试算法题1.3:如何计算两个单链表所代表的数之和

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [华为笔试题] 难度系数:⭐⭐⭐ ...

  9. Java反转单链表(code)

    主要是面试中可能会经常碰上该类似操作,尤其是稍大点公司,面试官可能并不在乎你能不能搞定该题,但是这类型题目最是能体现程序员的思维状态 ---一个迷糊头脑的程序员 怎能立志改变这个世界 /** * @a ...

随机推荐

  1. not in 前面/后面存在null值时的处理

    表声明 order_header表中有ship_method列: ship_method_map表中ship_method为主键列. 需求 找出order_header表中所有ship_method不 ...

  2. JSP自定义方法库

    如果JSTL的方法库没有满足需要,可以使用自定义方法进行扩展 public class Function{ public static int length(Object obj){ //返回对象的长 ...

  3. 【移动开发】自定义ProgressBar

    <ProgressBar android:layout_centerInParent="true" android:layout_width="30dp" ...

  4. UNIX网络编程——Socket/TCP粘包、多包和少包, 断包

    为什么TCP 会粘包 前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整.为什么会这样吗,我们用mina这样通信框架,还会出现这种问题? TCP(transport cont ...

  5. 收藏了4年的Android 源码分享

    Android 超过2个G的源代码集合~~几乎涵盖了所有功能效果的实现,一应俱全~~应有尽有~~ 360云盘地址:Android 各类源码集合汇总 (提取码:f930) 另外,附上Github上及自己 ...

  6. Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串

    应用场合:参考网上查询数据表的所有字段名代码,使用游标生成指定单个表的所有字段名跟逗号组成的用于select  逗号隔开的字段名列表 from字符串等场合. 查询结果输出如下: 当前数据表TB_UD_ ...

  7. 后端分布式系列:分布式存储-HDFS DataNode 设计实现解析

    前文分析了 NameNode,本文进一步解析 DataNode 的设计和实现要点. 文件存储 DataNode 正如其名是负责存储文件数据的节点.HDFS 中文件的存储方式是将文件按块(block)切 ...

  8. C++ 对象的内存布局(上)

    本文转载自haoel博主的博客:陈皓专栏 [空谷幽兰,心如皓月] 原文地址:C++ 对象的内存布局(上) C++ 对象的内存布局(上) 陈皓 http://blog.csdn.net/haoel 点击 ...

  9. 如何在Cocos2D游戏中实现A*寻路算法(五)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  10. 【一天一道LeetCode】#130. Surrounded Regions

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...