数据结构之单向链表
例如:现有双向链表OneWayLinked中存储着1,2,3,4四个元素,那么集合对象中会有4个节点A、B、C、D,由上述结构可以知道,节点A中存储着元素1和节点B;节点B中存储着元素2和节点C,节点C中存储着元素3和节点D,节点D中存储着元素4和null。如果现在要在元素2和3中间插入一个元素5;
过程如下:
1、创建节点E,E中存储元素5
2、将B中的下一个节点修改为节点E
3、将E中的下一个节点赋值为节点C
从上述过程看,插入时没有节点位置移动的操作,所以效率比较高;删除的过程和插入过程相反;和双向链表的区别就是一个节点中不再存储上一个节点
实例代码: /** * OneWayLinked类 * 演示双向链表这一数据结构的实现 * @author 学霸联盟 - 赵灿 */ public class OneWayLinked { // 用于存储链表的第一个节点 private Node first = null; // 用于存储链表的最后一个节点 private Node last = null; // 用于存储集合长度 private int size = 0; //添加元素的方法 public void add(Object obj){ //创建节点对象 Node node = new Node(); //节点中存储添加的元素 node.element = obj; //判断第一个节点是否为null if (first == null) { //第一个节点为说明是第一次添加元素 first = node; //将第一个节点的后一个节点都设置成自己 first.next = node; } //判断最后一个节点是否为null if(last == null){ /* * 如果最后一个节点也为null时 * last和first存储的是同一个Node对象的地址 */ last = node; }else{ //如果最后一个节点不为null //新创建的节点下一个节点存储自身 node.next = node; //此时last中保存的还是上一次添加元素时的最后一个节点 //所以它的下一个节点应该设置为当前新建的节点 last.next = node; //然后将last设置为当前新建的节点 last = node; } //添加元素,长度加1 size++; } /** * 根据下标获取元素 */ public Object get(int index) { //首先判断传入的下标是否超出长度 if (index < size) { /* * 声明一个Node类型的变量tagNode,并设置为first * 表示寻找的时候从第一个节点开始找 */ Node tagNode = first; for (int i = 0; i < index; i++) { //获取下一个节点,等价于i+1 tagNode = tagNode.next; } //获取找到的节点中的元素 return tagNode.element; } //如果传入的下标大于或等于长度,返回null return null; } /** * 节点类(私有的成员内部类) * * @author 学霸联盟 - 赵灿 */ private class Node { // 自身类型的变量,用于存储后一个节点 Node next; // Object类型的变量,用于存储元素 Object element; } } /** * OneWayLinkedTest类 * 用于测试双向链表 * @author 学霸联盟 - 赵灿 */ public class OneWayLinkedTest { public static void main(String[] args) { //创建双线链表的对象 OneWayLinked twl = new OneWayLinked(); //向链表中添加值 twl.add(1); twl.add(2); twl.add(3); twl.add(4); //获取下标为2的值 Object element = twl.get(2); //输出值 System.out.println(element); } } 运行结果: 3
时间: 2024-10-05 20:30:37