我们知道数组是我们很熟悉的一种存放数据的东西,但是它的问题我们也知道,一经创建它的大小也就固定了,固定存在着一个重要的问题“内存浪费”和“内存溢出”,也就是它不能动态的变换它的大小,而链表就很好的解决了这个问题,它是动态的,大小随着加入和删除节点而变化着自己的大小,java自带的垃圾回收也会处理被删除的节点。释放出内存。我们还知道,数组在查看元素上面是它的强项,同过它的下标,时间复杂度为O(1),就能定位到元素,链表在这个方面就差一点了,因为要想查看一个元素,必须遍历链表找到相应的元素,时间复杂度到了O(n),各有长处,也各有短处,这也像我们人一样嘛,人无完人,各有长短。
今天写了一下链表,实现链表“指定属性对比”的插入和删除。链表的节点是我们自己定义的类型,当然可一封装我们自己的属性,可一放一个人,放一辆车等等,类当然就可以封装自己的属性。
先定义一个简单的Link类,用它来生成对象,放到链表的每个节点上。代码如下:
package 链表; /* * 节点类,封装了属性 * @author TMS * */ public class Link { public int id; public double data; public Link next; //定义下一个节点 /* * 初始化节点的属性 */ public Link(int id,double data) { this.id = id; this.data = data; } /* * 打印出每个节点的信息 */ public void displayLink() { System.out.println("id = "+id+" "+"data = "+data); } }
接下来就是定义的一个链表类,相应的代码如下,有详细的注释:
package 链表; public class Linklist { private Link first; /* * 构造函数初始化第一个节点为null */ public Linklist() { first = null; } /* * 在链表的头部插入一个元素 */ public void insertFirst(int id, double data) { Link newLink = new Link(id, data); newLink.next = first; first = newLink; } /* * 指定匹配属性key查找相应的节点 * 使用循环遍历整个链表 */ public Link findLink(int key) { Link temp = first; while (temp.id != key) { if (temp.next == null) { return null; } else { temp = temp.next; } } return temp; } /* * 删除指定key值的节点 * 遍历整个链表找到对应的节点,找不到返回null */ public Link deletLink(int key) { Link temp = first; Link old = first; while (temp.id != key) { if (temp.next == null) { return null; // 找到末尾了都没有找到 } else { old = temp; temp = temp.next; } } // 循环结束找到了 if (temp == first) // 如果恰好要删除的是第一个节点,直接first = first.next; first = first.next; else old.next = temp.next; //要删除的节点在中间 return temp; } /* * 打印链表中的节点 * 遍历打印整个链表 */ public void displayList() { Link temp = first; while(temp != null) { temp.displayLink(); temp = temp.next; } } /* * 查看找到相应key值的节点 */ public void lookFindNode(Link link) { if(link != null) { System.out.println("找到了相应的key值的节点 :"+link.data); } else{ System.out.println("没有找到相应的key值的节点!"); } } /* * 查看删除相应key的节点 */ public void lookdeletNode(Link link) { if(link != null) { System.out.println("节点已经删除,为:"+link.data); } else { System.out.println("没有删除相应的节点"); } } /* * main方法进行测试 */ public static void main(String[] args) { Linklist list = new Linklist(); list.insertFirst(1, 10.0); list.insertFirst(2, 20.0); list.insertFirst(5, 30.0); list.insertFirst(7, 40.0); list.insertFirst(3, 50.0); System.out.println("打印插入的元素:"); list.displayList(); System.out.println("<------------------------------------------>"); System.out.println("查找相应key值的节点:"); Link l = list.findLink(8); list.lookFindNode(l); Link l2 = list.findLink(2); list.lookFindNode(l2); System.out.println("<------------------------------------------>"); System.out.println("删除相应key值的节点:"); Link l3 = list.deletLink(10); list.lookdeletNode(l3); Link l4 = list.deletLink(7); list.lookdeletNode(l4); System.out.println("删除后:"); list.displayList(); } }
测试输出结果:
打印插入的元素: id = 3 data = 50.0 id = 7 data = 40.0 id = 5 data = 30.0 id = 2 data = 20.0 id = 1 data = 10.0 <------------------------------------------> 查找相应key值的节点: 没有找到相应的key值的节点! 找到了相应的key值的节点 :20.0 <------------------------------------------> 删除相应key值的节点: 没有删除相应的节点 节点已经删除,为:40.0 删除后: id = 3 data = 50.0 id = 5 data = 30.0 id = 2 data = 20.0 id = 1 data = 10.0
PS:好,结束一天,洗洗睡了。链表的知识和形式还有很多,期待下一发。
相关推荐
创建链表插入删除创建链表插入删除创建链表插入删除
这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。
用c++实现链表的建立、插入和删除操作。希望能对刚学数据结构的同学有点帮助。
数据结构经典算法演示,这里是链表-插入节点的代码演示
链表结点插入算法
数据结构 c语言编译 作业 链表 创建,实现链表的创建,删除,插入数据
链表的基本操作全实现,插入,删除,查找,遍历 倒置等,经过本人验证,全部实现
用C语言编写的链表中插入节点的程序,供学习参考交流用
数据结构:图解链表,链表的插入和删除(c语言版) 我们上节讲解了链表的建立,本节讲解的是在链表中指定位置中插入一个结点,以及在指定位置中删除一个结点 指定位置插入一个结点 这里我们在第3个结点后插入一个...
自己编写的双向链表功能实现算法,纯自己瞎编的,虽然用来混点分数,但还是可以做为参考的吧,哈哈
数据结构 链表节点的删除 通过三种方法对链表节点进行删除。
尤其是,当用链表描述不同的数据结构时,节点结构体的定义都是不同的,这就需要为每一种链表都写一套诸如插入、删除节点之类的操作代码。 本程序就是为了解决这个问题,将双向链表的基本操作写成了一套通用程序,...
数据结构 初始化链表,插入删除节点,遍历链表,链表长度,找出中间节点
每敲一次代码都会有新的收获,基本功不扎实啥也干不了。单向链表的插入,删除,创建,遍历是数据结构的基本操作。里边的算法值得学习。下面我们就来学习一下单向链表结点的逐个删除的方法。
VC6.0下 用C语言实现单向链表的创建、插入,删除节点,和2个链表合并等操作
链表的插入删除 c语言版链表 删除 插入 c语言
分2个子函数描述了链表的头插入和尾插入,通过条件编译来控制选择具体算法。
数据结构链表的插入与删除C语言的实现,与"数据结构C语言版"课本相配套,基于课本实例
数据结构 链表的基本操作插入查询删除 算法思想: ...建立删除函数,用于在链表中删除指定的元素 建立主函数,在主函数中写一个菜单,根据用户选择不同的功能,调用不同的 函数,从而实现不同的功能
在分析链表的算法的时候一定要注意心里有数, 先搞清楚完成这个算法需要 哪几步, 每步做什么, 然后再去思考每步的代码实现是什么, 否则就会只看到指 针指来指去, 很快就晕头转向了。 头插入节点的两个重要步骤:...