我们知道数组是我们很熟悉的一种存放数据的东西,但是它的问题我们也知道,一经创建它的大小也就固定了,固定存在着一个重要的问题“内存浪费”和“内存溢出”,也就是它不能动态的变换它的大小,而链表就很好的解决了这个问题,它是动态的,大小随着加入和删除节点而变化着自己的大小,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:好,结束一天,洗洗睡了。链表的知识和形式还有很多,期待下一发。
相关推荐
本文将深入探讨链表中的节点插入算法,包括其基本原理、实现步骤、示例代码等方面的内容。 #### 1. 链表基础知识 在了解插入节点算法之前,我们需要先回顾一下链表的基本概念。链表可以分为单向链表和双向链表两种...
这种特性使得链表在插入和删除操作上具有优势,因为它们不需要移动大量元素。 链表主要由节点(也称为结点)组成,每个节点包含两部分:数据域,用于存储实际的数据;指针域,用于指向下一个节点。根据指针的方向,...
这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。
用c++实现链表的建立、插入和删除操作。希望能对刚学数据结构的同学有点帮助。
本文介绍了如何使用C语言实现单向链表的基本操作,包括创建链表、插入节点、删除节点以及遍历链表。通过这些基本操作,可以构建出功能更为强大的数据结构,并应用于各种实际问题的解决中。链表作为一种灵活的数据...
以上是基于给定代码片段对双向链表的一些基本操作的实现与解释,包括了创建、插入、删除和查询等功能。这些操作是双向链表中最基础也是最常用的,掌握了这些操作可以帮助更好地理解和使用双向链表。
本问题主要关注如何在链表中指定位置插入一个新节点。这里我们有一个名为`student`的结构体,它包含两个字段:`num`(可能是学生的学号)和`score`(分数),以及一个指向下一个`student`节点的指针`next`。`n`变量...
数据结构经典算法演示,这里是链表-插入节点的代码演示
与数组不同的是,链表中的元素在内存中不必连续存放,这使得链表在插入和删除操作上比数组更加灵活高效。 #### 链表基础 链表由一系列节点组成,每个节点包含两个部分:一个数据域(用于存储实际的数据)和一个指针...
链表分为单向链表、双向链表和循环链表等类型,这里主要讨论单向链表的插入和删除操作。 **链表的插入操作** 1. **头插法**:在链表头部插入新节点。首先创建新节点,然后将新节点的next指针指向当前链表的头节点...
总的来说,线性链表插入和删除的关键在于定位目标节点和正确地更新指针。这两个操作都需要遍历链表,找到目标位置,然后进行相应的内存管理和指针调整。通过对比这两个程序,我们可以看到不同实现风格对相同功能的...
本文将详细讲解如何使用C语言在Microsoft Visual C++ 6.0环境下实现单向链表的创建、插入、删除节点以及两个链表的合并。 一、单向链表的基本概念 单向链表是一种线性数据结构,每个元素(称为节点)包含两部分:...
在这个C语言程序中,我们创建了一个动态链表的数据结构,并实现了动态链表的建立、删除和插入操作。这些是链表操作的基础,对于理解和掌握数据结构至关重要。 首先,链表是一种线性数据结构,其中元素(节点)不...
这个函数通常会接收新的节点数据和当前链表的头节点作为参数,然后创建一个新的节点,将新节点的next指针指向头节点,并将头节点的前一个指针(如果有的话)指向新节点,最后更新链表的头节点为新插入的节点。...
链表是一种基础且重要的数据结构,它在...了解并熟练掌握链表的插入、删除和查询操作,对于理解和实现复杂的算法至关重要。在实际编程中,根据具体需求选择合适的数据结构,如链表或数组,是优化程序性能的关键步骤。
这种设计使得在链表中进行插入和删除操作相对容易,因为我们可以快速地访问到相邻的节点。双链表的节点结构通常定义为以下形式: ```c typedef struct Node { void* data; // 数据域 struct Node* prev; // 指向...
链表的操作主要包括插入和删除等,这些操作是实现更复杂算法的基础。 #### 链表的插入操作 在C语言中,链表的插入操作通常涉及到创建新节点、调整节点之间的连接以及释放内存等步骤。具体来说: 1. **创建新节点*...
本文将详细介绍如何在链表中的指定位置插入一个节点以及如何删除指定位置的节点,并通过示例代码进行解释。 #### 链表插入节点 在链表中插入节点通常涉及到以下几个步骤: 1. **找到插入位置的前一个节点**。 2. *...
链表的建立、插入和删除是C语言中重要的数据结构操作,它们提供了动态管理和操作数据的能力。通过合理设计链表结构和操作函数,可以有效地解决数组大小限制的问题,提高程序的灵活性和效率。理解链表的基本原理和...
尤其是,当用链表描述不同的数据结构时,节点结构体的定义都是不同的,这就需要为每一种链表都写一套诸如插入、删除节点之类的操作代码。 本程序就是为了解决这个问题,将双向链表的基本操作写成了一套通用程序,...