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

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

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. VirtualBox动态添加虚拟硬盘

    本文非技术类文章,仅作为记录. 因为使用VirtualBox时遇到这样的问题:原本虚拟机分配存储的80G已经足够了,但是随着使用的文件越来越多,需要的空间也越来越大,因此不得不扩展虚拟机的磁盘容量. ...

  2. JS基础之对象

    JS中一切皆为对象,这是一句常说的话.了解JS对象,从这句话开始吧.JS中的基本数据类型如number,bool,字符串,数组,null,undefined等等都是对象. 对象的本质: 带有属性和方法 ...

  3. java中的String

    String作为java最常用的类,被广大程序员们蹂躏已久,让我们又爱又恨,应该如何正确的使用它呢,老姜带你一起来揭开它神秘的面纱. 一.String类定义时被冠上了final的标识符,决定了它终生不 ...

  4. sql执行循序

    (8) select (9) distinct (11) top 1 (6) Table1.id,COUNT(Table1.name) as nameCount (1) from Table1 (3) ...

  5. Combobox的使用

    第一次写博客,只是对自己在工作中遇到的问题进行一次总结回顾,为以后有同样的错误有一个参考: 由于最近空余时间很少,只是零零散散的把平时记录的笔记搬到博客园而已,博客中可能出现一些低级错误,希望互相学习 ...

  6. MVC的增删改查

    基本都要使用C控制器中的两个action来完成操作,一个用于从主界面跳转到新页面.同时将所需操作的数据传到新界面,另一个则对应新界面的按钮,用于完成操作.将数据传回主界面以及跳转回主界面.根据不同情况 ...

  7. [Cordova] 手机网页里的1px

    [Cordova] 手机网页里的1px 1px的显示 Cordova让开发人员可以使用HTML页面,来开发APP的显示内容.但是在手机上,HTML页面里定义的1px,并不是直接对应到手机屏幕的一个像素 ...

  8. django基础篇

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  9. sharepoint 相关<httpHandlers>

    <add verb="GET,POST,HEAD,(GETSOURCE),(HEADSOURCE),(POSTSOURCE)" path="*.doc,*.docx ...

  10. React Native环境配置和简单使用

    # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...