Java数据结构之手写单链表

谁借莪1个温暖的怀抱¢ 2024-04-06 11:31 105阅读 0赞

简单实现单链表

  1. package com.mmg;
  2. /**
  3. * 节点类
  4. * @author MUMANGGUO
  5. */
  6. public class Node {
  7. public Object data;
  8. public Node next;
  9. public Node(Object values, Node next) {
  10. super();
  11. this.data = values;
  12. this.next = next;
  13. }
  14. public Node() {
  15. this(null, null);
  16. }
  17. public String toString() {
  18. return this.data.toString();
  19. }
  20. }
  21. package com.mmg;
  22. public class MySinglyLinkedList {
  23. // 单链表的头指针,指向头结点
  24. public Node head;
  25. // 构造空单链表
  26. public MySinglyLinkedList() {
  27. head = new Node(); // 创建头结点,data和next的值均为null
  28. }
  29. // 构造单链表,由数组提供元素
  30. public MySinglyLinkedList(Object[] values) {
  31. this(); // 创建只有头结点的单链表
  32. Node rear = this.head; // rear指向单链表的尾结点
  33. for (int i = 0; i < values.length; i++) {
  34. rear.next = new Node(values[i], null); // 尾插法,创建结点链接入rear结点之后
  35. rear = rear.next; // rear指向新的尾结点
  36. }
  37. }
  38. public Object get(int i) {// 返回元素ai,若i越界,返回null
  39. int j = 0;
  40. Node p = this.head.next;
  41. for (i = 0; p != null && j < i; j++) { // 遍历单链表,寻找第i个结点
  42. p = p.next;
  43. }
  44. return (i >= 0 && p != null) ? p.data : null;// 若p指向ai,返回其data值
  45. }
  46. public void set(int i, Object obj) {// 设置元素ai的值,即设置其data域的值为t
  47. int j = 0;
  48. Node p = this.head.next;
  49. for (i = 0; p != null && j < i; j++) { // 遍历单链表,寻找结点ai
  50. p = p.next;
  51. }
  52. if (i >= 0 && p != null) {
  53. p.data = obj; // 将ai的data域设置为t
  54. }
  55. }
  56. public int add(Object obj) {
  57. return add(this.length(), obj);
  58. }
  59. public int add(int i, Object t) {
  60. // 在a(i)的位置插入元素t,若插入成功,返回i,否则 ,返回-1
  61. int j = 0;
  62. if (t == null)
  63. throw new NullPointerException("不能插入空对象!");// 抛出空对象异常
  64. Node p = this.head;
  65. while (p.next != null && j < i) { // 寻找a(i-1)结点
  66. p = p.next;
  67. j++;
  68. }
  69. if (p != null && j == i) { // 找到a(i-1)结点
  70. Node s = new Node(t, p.next); // 建立新结点,数据域为元素t,地址域为p.next
  71. p.next = s; // 在p之后插入新结点
  72. return i; // 插入成功,返回i
  73. } else {
  74. return -1; // 插入失败,返回-1
  75. }
  76. }
  77. // 删除结点a(i)
  78. public Object remove(int i) {
  79. int j = 0;
  80. Node p = this.head;
  81. while (p.next != null && j < i) { // 寻找a(i-1)结点
  82. p = p.next;
  83. j++;
  84. }
  85. if (p.next != null && j == i) { // a(i)结点存在
  86. Object old = p.next.data; // 保存待删除结点的数据域
  87. p.next = p.next.next; // 删除结点,包括开始结点、中间结点和尾结点删除
  88. return old; // 返回已删除结点的数据域
  89. } else {
  90. return null; // i越界,返回null
  91. }
  92. }
  93. // 判断单链表中是否包含key元素
  94. public boolean contains(Object key) {
  95. Node p = this.head.next;
  96. for (; p != null; p = p.next) { // 遍历单链表
  97. if (p.data.equals(key)) {
  98. return true;
  99. }
  100. }
  101. return false;
  102. }
  103. // 在单链表查找首次出现的与key相等元素,返回元素位置,若不存在,则返回-1
  104. public int indexOf(Object key) {
  105. int i = 0;
  106. Node p = this.head.next;
  107. for (; p != null; p = p.next) { // 遍历单链表
  108. if (p.data.equals(key)) {
  109. return i;
  110. }
  111. i++;
  112. }
  113. return -1;
  114. }
  115. // 返回单链表的长度
  116. public int length() {
  117. int n = 0;
  118. Node p = this.head.next;
  119. while (p != null) {
  120. n++;
  121. p = p.next;
  122. }
  123. return n;
  124. }
  125. // 清空单链表
  126. public void clear() {
  127. this.head.next = null;
  128. }
  129. // 判断单链表是否为空
  130. public boolean isEmpty() {
  131. return this.head.next == null;
  132. }
  133. // 遍历单链表
  134. public void printList() {
  135. Node p = this.head.next;
  136. while (p != null) {
  137. System.out.println(p.data); // 输出结点的数据域
  138. p = p.next; // 指针后移一个结点
  139. }
  140. }
  141. }

可以自己写一个测试类进行测试

发表评论

表情:
评论列表 (有 0 条评论,105人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java数据结构

    在单链表中对表头进行插入或者删除时,时间复杂度为O(1)。 单链表查询指定节点时因为要进行循环查找,平均需要查找N/2次,所以时间复杂度为O(N)。 存储密度=数据占用的存

    相关 数据结构

    众所周知,线性表是数据结构中的一种基本的数据结构。线性表的实现基本的有两种:一种是顺序存储方式,另一种是链式存储方式。 顺序存储的线性表又叫顺序表,实现时一般利用数组等

    相关 数据结构

    由于顺序表再插入或者删除时需要移动大量数据,并且如果表比较大, 会比较难分配连续的存储空间导致存储数据失败。因此可以采用链表结构,链表结构是一种动态存储分配的结构形式,可以根据

    相关 数据结构-

        单链表即每个节点都存在数据域和指针域(特殊节点除外),每个节点都一个直接前驱节点和直接后继节点(头节点无前驱,尾节点无后继),简单来说就是上一个节点的指针域中存放了下一

    相关 数据结构

    数据结构:在计算机科学中,数据结构是计算机中存储、组织数据的方式。数据结构往往决定了算法的效率。选择数据结构应首先考虑其抽象数据类型。数据结构通过编程语言所提供的数据类型、引用