首先,单链表相对于队列的优势在于存储地址不是连续的,这样的意义在于,操作其中的某一个位置的元素时不需要对之前的其他元素都进行内存操作,大大的为我们的计算机减压了。下面直接进入正题:

先要定义一个结点类,如下:

Java代码

public class Node {
Node next;//下一个结点的引用
Object obj;//结点元素
public Node(Object obj){
this.obj=obj;
}
}

然后就是我们的LinkedList类,先要定义一个空链表:

Node head=null;//创建一个空链表,头结点

Node last=head;//尾结点

打印链表有两种方法,可以采用递归,也可以使用非递归的方法,如下:

Java代码

/**
* 非递归打印元素的方法
*/
public void print(Node head){
while(head!=null){
System.out.println(head.obj);
head=head.next;//索引向后移位
}
}
/**
* 递归打印链表元素的方法
*/
public void printNode(Node head){
if(head!=null){
System.out.println(head.obj);
Node node=head.next;
printNode(node);//递归调用
}
}

非递归方法有一个致命的缺陷,打印的同时改变了头结点的位置,所以我们应该倾向于使用递归方法。

说了这么多,增删查改正式开始:

向链表中添加元素。判断一个链表已经到达末尾的依据是该结点的next引用已经为Null,所以要向末尾添加一个结点,先要把新增结点放在最后,再把末尾结点向后移位,具体操作过程如下图:

代码如下:

Java代码

/**
* 向指定链表添加元素的方法
* @param obj 插入的元素
*/
public void add(Object obj){
Node node=new Node(obj);//新建结点
if(head==null){//如果链表为空
head = node;
}else{
last.next=node;//先把新增结点放在最后
}
last=node;//再把最后一个结点向后移位
}

插入元素。要插入一个新元素首先要创建一个新结点来存放它,而在具体实现的时候最让人头疼的时候无疑是怎样找到指定位置的索引了,这里所说的方法在下面的其他操作基本上都是这样衍生的,先了解一下插入结点的具体实现,根据这个结构的逻辑定义,如果我们要在结点A之后插入一个结点,那么就还需要修改结点A的next引用,实际上就是让A结点的next引用指向新增结点的元素域,然后再让新增结点的next引用指向A原本next结点(B)的元素域,用图来表示更加直观:

代码如下:

Java代码

/**
* 向链表中插入新元素的方法
*/
public void insert(int index,Object obj){
Node node=head;
int j=0;
while(node!=null&&j<index-2){
//查找到第index-1个元素
node=node.next;
j++;
}
Node sert=new Node(obj);//被插入的结点
sert.next=node.next;
node.next=sert;
}

删除元素。知道了插入元素的具体操作之后,删除元素就显得相对简单了,比如说我们要删除一个结点b,就是要使这个结点失去引用,但是注意不要直接写b=b.next,这样的话b的引用还是存在,而且还会出现另一种错误,大家可以自己试一下,如图所示,正确的删除结点的方法如下:

代码如下:

Java代码

/**
* 删除指定位置的结点
* @param index 索引
*/
public void delete(int index){
Node node=head;
int j=0;
while(node!=null&&j<index-2){
//查找到第i-1个元素
node=node.next;
j++;
}
node.next=node.next.next;//删除第index个元素
}

http://www.cnblogs.com/baixingqiang/

最后就是修改元素了。相信大家看完之前的两个方法,接下来的这个方法在心中早就已经泛起波澜了吧,那下面就直接贴代码了:

Java代码

/**
* 改变指定位置的元素
* @param index 索引
* @param obj
*/
public void modify(int index,Object obj){
Node node=head;
int j=0;
while(node!=null&&j<index-1){
//找到第index个结点
node=node.next;
j++;
}
node.obj=obj;
}

当然,除了这些基本操作,我们还可以写获取链表长度的方法,获取指定位置的元素的方法等等

java 链表数据结构的更多相关文章

  1. Java描述数据结构之链表的增删改查

    链表是一种常见的基础数据结构,它是一种线性表,但在内存中它并不是顺序存储的,它是以链式进行存储的,每一个节点里存放的是下一个节点的"指针".在Java中的数据分为引用数据类型和基础 ...

  2. 单链表数据结构 - java简单实现

    链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点.每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值.如图就是一个单向链表 一个单向链 ...

  3. java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表

    java实现 数据结构:链表. 栈. 队列.优先级队列.哈希表   数据结构javavector工作importlist 最近在准备找工作的事情,就复习了一下java.翻了一下书和网上的教材,发现虽然 ...

  4. java项目——数据结构实验报告

    java项目——数据结构总结报告 20135315  宋宸宁 实验要求 1.用java语言实现数据结构中的线性表.哈希表.树.图.队列.堆栈.排序查找算法的类. 2.设计集合框架,使用泛型实现各类. ...

  5. JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balaba ...

  6. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

  7. (6)Java数据结构-- 转:JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析  http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balab ...

  8. JAVA链表中迭代器的实现

    注:本文代码出自<java数据结构和算法>一书. PS:本文中类的名字定义存在问题,Link9应改为Link.LinkList9应该为LinkList.由于在同包下存在该名称,所以在后面接 ...

  9. 【转】Java学习---Java核心数据结构(List,Map,Set)使用技巧与优化

    [原文]https://www.toutiao.com/i6594587397101453827/ Java核心数据结构(List,Map,Set)使用技巧与优化 JDK提供了一组主要的数据结构实现, ...

随机推荐

  1. zigbee 路由节点丢失后清除 该节点的残余网络信息

    清除脱离网络的 路由节点(stale device)的 残留在各表中以AssociationDevList为例的残余信息. 如图所示拓扑结构中: 路由器1脱离网络后,通过协调器按键操作来  清除 协调 ...

  2. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  3. python之redis和memcache操作

    Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...

  4. 妈妈再也不用担心我找不到spring源码了!

    获取spring源码: http://repo.springsource.org/libs-release-local/ http://repo.springsource.org/libs-relea ...

  5. js中this的绑定

    人们对于this的绑定常常有两个误解,一:指向函数本身,二:指向函数作用域.这两种想法都是错的,this并不指向函数本身,也不指向函数作用域. function foo(){ this.count++ ...

  6. JS中用new创建对象与不用new创建对象区别:

    function classA() { console.log(this); var that = this == window ? {} : this; that.name = "clas ...

  7. 12种不适宜使用的javascript语法

    1. == (o゜▽゜)o☆[BINGO!] Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前 ...

  8. CSS3图片翻转切换案例及其中重要属性解析

    图片翻转切换,在不使用CSS3的情况下,一般都是使用JS实现动画,同时操作元素的width和left,或者height和top以模拟翻转的效果,并在适当时候改变src或者z-index实现图片切换. ...

  9. 本周进步要点20161023(含李笑来第二场live笔记要点)

    本周主要忙于去武汉参加iDOF2016智能数字油田会议,会上做了题为“油田SOA及云平台的系统思考与实践”的报告,为了准备这篇报告,用到了一些以前学过的知识,具体内容见“参加iDOF2016会议的收获 ...

  10. textview设置drawable

    textview可以在上下左右四个方向添加图片,同时也可以动态改变这些图片:   下面有我写的一个例子: 在xml文件中:  <TextView                 android: ...