A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 鸭鸭鸭鸭 于 2019-2-28 15:58 编辑

                                         Java数据结构-单链表的实现

概述

       借用知乎网友的一句话:如果说 Java 是自动档轿车,C 就是手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A 开到 B,而且未必就比懂得的人慢。写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车。但若你此生在编程领域还有点更高的追求,数据结构是绕不开的课题。
       数据结构中有许多种类型,而且实现的语言也有C 也有java.今天我们来讲讲 单链表的java实现添加节点。

单链表概述


       单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

单链表的实现原理




       说明:在单链表中,我们定义一个节点Node 包括两个部分:元数据和下一个节点的地址。节点和节点之间 通过next(即下一个节点的地址)来进行关联,这样就形成了一个链式结构。我们很轻易的就能从头(head)结点一直遍历到最后边的节点。这种结构有点像铁锁一样环环相扣。

单链表的java实现

       实现数据结构的语言可以有很多,这里我们介绍使用java语言来实现。

实现添加向链表中添加节点的步骤

  • 定义单链表对象并在内部定义一个节点对象Node
  • 实现向单链表对象中添加节点的功能
  • 测试
   
定义单链表对象

package com.itheima.link;
/**
* 单列表
* @title SingleLink.java
*            <p>
*            description
*            </p>
*            <p>
*            company: www.itheima.com
*            </p>
* @author 三国的包子
* @version 1.0
*
*
*/
public class SingleLink {
      // 结点对象
     class Node {
            Object data;// 数据
            Node next;// 下一个节点的地址引用

           // 构造函数 获取数据
           public Node(Object data) {
                  this.data = data;
            }
    }
    Node head;// 表示链表的头结点
}

在SingleLink中增加添加节点的方法

/**
* 从尾部添加一个节点
*
* @param data
*                       要添加的节点的数据
*/
public void add(Object data) {
        // 1.构建一个节点对象
        Node node = new Node(data);
        if (head == null) {
            // 2.判断链表中是否为空 如果为空 则新增的节点变成头节点
           head = node;
        } else {
             // 3.如果链表不为空,则需要查询到尾部节点
            Node rear = findRearNode();
           // 4.向尾部节点添加一个节点
           rear.next = node;// rear肯定不为空
        }
}
/**
* 找到尾部节点
*
* @return
*/
private Node findRearNode() {
        // 从头开始遍历
       // 1.定义一个临时变量 让其等于头
       Node temp = head;
       while (temp != null) {// 如果不等于空继续遍历
              if (temp.next == null) {// 如果接的next的属性为空说明 该节点为尾部节点
                  break;// 跳出循环
              }
              temp = temp.next;// 遍历下一个
      }
      return temp;
}

重写toString 方法用于测试

// 重写方法 打印数据
@Override
public String toString() {
       StringBuffer stringBuffer = new StringBuffer("[");
       // 遍历
      Node temp = head;
      while (temp != null) {
             if (temp.next == null) {
                 stringBuffer.append(temp.data);
                 break;
             } else {
                  stringBuffer.append(temp.data + ",");
            }
            temp = temp.next;
     }
     stringBuffer.append("]");
     return stringBuffer.toString();
}

测试

   public class TestLink {
          public static void main(String[] args) {
                 SingleLink singleLink = new SingleLink();
                 singleLink.add(1);
                 singleLink.add(2);
                 singleLink.add(3);

                System.out.println(singleLink);
          }
   }

测试效果
输出结果如下:
[1,2,3]

总结


       通过上边的例子,我们构建了一个链表对象 并向链表对象中添加了一些元素,模拟了集合中添加元素的方法。简单的入门就到这里了,这帮助我们去理解。另外查询节点的方法,可以通过节点图来理解即可。另外还有些链表的操作方法,我会陆续实现。















3 个回复

倒序浏览
回复 使用道具 举报
看一看,
回复 使用道具 举报
原来如此
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马