Java中的链表
我在写关于java代码的过程中,总要引用C中的术语,并不是因为卖弄C中的学识,而是作为一种最为基础的语言,它的最先存在必定是有意义的,毕竟C++,C#,java都是以它为基础慢慢建立起来的,所以在链表这里我一如往常引用C中的指针来解释。首先插入一段代码:
public class Data { Data next;//定义节点,其实在这里节点的概念最难理解,我的理解是开辟一个对象空间一个框,用于指针(C术语)来获取到节点,来接受外来位置 Object data;//定义元素 }
这里的关键是next应用,它在C语言中是指针的应用,但是我们都知道Java中并没有指针,所以我们解释成引用,它用来保存当前节点的地址和指向下一个节点。Object data 由于无法知道将要插入元素的类型,所以定义为Object
一下的难点是插入实现,它涉及到前节点和后节点,图示会清楚一些:
public class Link {
private Data root;//定义表头
private Data tail;//定义表尾
private int size;//定义长度
public static void main(String args[]){
Link link=new Link();
for(int i=0; i<10; i++){
link.add("str"+i);
}
// System.out.println("删除的元素是:"+link.remove(9));
//System.out.println("删除的元素是:"+link.remove(0));
link.insert(0,"a");
link.insert(2, "b");
for(int i=0; i<link.getsize(); i++){
System.out.println(link.get(i));
}
System.out.println("===========================");
//link.add("add");
for(int i=0; i<link.getsize(); i++){
System.out.println(link.get(i));
}
}
//定义将要添加到链表的元素
public void add(Object data){
Data node=new Data();//创建数据对象
node.data=data;//接受传入数据
//如果表头为0,也就是链表为空
if(root==null){
root=node;//将将要加入的节点位置赋给表头
tail=node;//同理,表尾的位置也是新加入元素位置
}
//如果链表不为空
else{
tail.next=node;//将链表尾部下一个位置指向node的地址
tail=node;//因为表尾永远指向表尾,所以将表尾指向node节点的位置
}
size++;//长度+1
}
//查找指定位置的元素
public Object get(int index){
//判断越界情况
if(index<0||index>=size){
throw new java.lang.ArrayIndexOutOfBoundsException("超出队列范围!");
}
//定义一个temp值来接受表头,具体作用下面代码诠释
Data temp=root;
//遍历不断指向下一个节点
for(int i=0;i<index;i++){
temp=temp.next;
}
return temp.data;
}
public boolean insert(int index,Object a){
Data node=new Data();//创建数据对象
node.data=a;//接受传入数据
if(index < 0 || index >= size){
//抛出一个异常
throw new java.lang.ArrayIndexOutOfBoundsException("超出队列范围!");
}
//表头添加方法
if(index==0){
//将当前节点指针指向根节点,相当于插入,形象理解为鼠标插入电脑,next就是那根线
node.next=root;
//因为根节点总是指向表头,所以将根节点指向表头
root=node;
//长度+1
size++;
return true;
}
//定义一个节点来接受根节点
Data temp=root;
//遍历循环来查找将要插入元素的前一个节点
for(int i=0;i<index-1;i++){
//循环查找
temp=temp.next;
}
//定义一个节点来存储将要插入元素的下一个节点
Data temp1=temp.next;
//将插入元素的上一个节点指针指向当前节点,相当于连接
temp.next=node;
//将当前节点的指针指向将要插入元素位置的下一个节点
node.next=temp1;
//长度+1
size++;
return true;
}
public Object remove(int index){
if(index < 0 || index >= size){
//抛出一个异常
throw new java.lang.ArrayIndexOutOfBoundsException("超出队列范围!");
}
//当长度为1时具体处理,理由是不走for循环
if(size == 1){
size--;
Object obj = root.data;//定义一个对象接收data
root = null;//清空
return obj;
}
size--;
//理由同上
if(index == 0){
Object obj = root.data;
root = root.next;
return obj;
}
//遍历循环寻找要删除的元素的前一个结点,
Data temp = root;
for(int i=0; i< index-1;i++){
temp = temp.next;
}
Object obj = temp.next.data;//将下一个节点的数据赋给obj,也就是将要删除的元素
temp.next = temp.next.next;//跳过此结点,也就是结点存储下下节点的位置
//节点尾部的处理
if(index == size){
tail = temp;
}
return obj;
}
//返回链表长度
public int getsize(){
return size;
}
}
出来的结果大致上是:
相关推荐
这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。
在本主题中,我们将深入探讨链表的操作,包括插入、删除、初始化以及添加节点。 1. **链表的基本结构** 链表由一系列节点组成,每个节点包含两部分:数据元素和指向下一个节点的指针。在单链表中,每个节点只有一...
### 链表插入节点算法详解 在计算机科学中,链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据元素以及指向下一个节点的指针。链表的灵活性和动态性使得它成为实现各种数据处理任务的理想选择。本文...
### C语言链表的建立、插入和删除 #### 链表概念与背景 在C语言编程中,链表作为一种动态数据结构,相较于静态数组,提供了更灵活的内存管理方式。链表的每个元素(称为节点)包含数据部分和指向下一个节点的指针...
### 链表基本操作:插入与删除 链表是一种常用的数据结构,在计算机科学中扮演着重要的角色。链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的操作主要包括插入和删除等,这些操作是实现更...
2. 找到插入位置:根据需求确定要插入的位置,例如在链表头部(即添加新节点为头节点)、尾部或某个特定位置。 3. 修改指针:更新新节点和前后节点的指针,使链表保持正确连接。 删除操作也涉及到几个关键步骤: 1....
在压缩包文件"双链表2"中,可能包含了示例代码或练习题,用于帮助读者理解双链表插入操作的实现和验证。通过实践这些例子,你可以更好地掌握双链表的使用和管理技巧。 总之,双链表是C语言中一种强大的数据结构,其...
与数组不同,链表的元素不需要在内存中连续存储,这使得它们在插入和删除操作上具有较高的效率。下面我们将深入探讨链表的一些基本概念、操作以及在项目中的应用。 首先,链表由一系列节点组成,每个节点包含两部分...
用户可以自由添加元素,查找特定元素,遍历并显示链表,删除元素,最后释放链表所占用的内存。 接口调用是程序模块化设计的一部分,它允许各个部分的代码独立开发和测试,然后通过接口进行交互。这种方式提高了代码...
本文将详细讲解如何使用C语言在Microsoft Visual C++ 6.0环境下实现单向链表的创建、插入、删除节点以及两个链表的合并。 一、单向链表的基本概念 单向链表是一种线性数据结构,每个元素(称为节点)包含两部分:...
在本主题中,我们将深入探讨如何在链表中执行插入和删除操作,以及实现其他相关功能。 首先,我们需要理解链表的基本概念。链表不同于数组,它的元素不是在内存中连续存储的。每个元素(称为节点)包含两部分:数据...
例如,插入元素可以使用`push_front()`或`push_back()`将元素添加到链表的开头或结尾;`insert()`函数则可以在指定位置插入元素。删除操作通常有`erase()`函数,可以按位置或值删除元素。查找操作可以通过迭代器遍历...
本资源重点在于实现单链表和双链表的基本操作,包括添加、删除和查阅元素,这些都是链表操作的核心。 首先,我们来深入理解单链表。单链表每个节点包含两部分:数据域和指针域。数据域存储实际的数据,而指针域指向...
链表是一种动态的数据结构,它可以根据需要动态地添加或删除节点。链表的每个节点都包含一个指向下一个节点的指针,这样可以形成一个链式的结构。 链表的创建 在本实验中,我们使用C语言来创建一个链表。我们首先...
双向链表插入结点 插入节点操作分为头插、尾插以及在任意位置插入。在双向链表中,插入节点时需要同时更新前后两个节点的指针。例如,在某个节点后插入新节点,需要将新节点的前一个指针设为原节点,后一个指针设...
在本文中,我们将深入探讨链表的创建、添加元素和删除元素等核心概念,这些都是C语言中链表操作的基础。 首先,让我们了解链表的基本结构。链表与数组不同,它不是在内存中连续存储数据。每个链表节点包含两部分:...
本程序是关于双链表基本操作的实现,包括创建、插入、删除和读取节点等关键功能。 首先,我们来看如何创建双链表。创建双链表通常从一个空链表开始,然后逐步添加节点。在程序中,我们首先定义一个数组,这个数组将...
在这个C语言程序中,我们创建了一个动态链表的数据结构,并实现了动态链表的建立、删除和插入操作。这些是链表操作的基础,对于理解和掌握数据结构至关重要。 首先,链表是一种线性数据结构,其中元素(节点)不...
正确理解和实现链表插入是理解和使用链表的关键。 总之,“LianBiao.rar_lianbiao_结构体_链表 插入”是一个关于如何利用结构体构建链表并实现插入功能的项目。通过这个项目,我们可以学习链表的基本原理,结构体的...
链表插入操作指的是在指定位置插入一个新的节点,通常涉及到调整指针指向,使新节点成为链表的一部分。 #### 实现代码 ```cpp Status ListInsert_L(LinkList L, int i, ElemType e) { int j; LinkList p, s; p =...