链表:一种数据存储结构.学链表首先要搞懂数组,按朋友的话说,数组和链表的关系就相当于QQ2008和QQ2009. 除非要通过索引频繁访问各个数据,不然大多数情况下都可以用链表代替数组. 链表部分主要要涉及:单链表,双端链表,有序链表,双向链表和有迭代器的链表(迭代器是用来随机访问链表元素的一种方法). 由于以前贪玩数据结构没上课,现在后悔所以要努力补上.
链结点:在链表中,每个数据项都被包含在"链结点"(Link)中.一个链结点是某个类的对象,这个类可以叫Link.而每个Link对象中又包含着一个对下一个链结点引用的字段(通常叫next).但是链表(LinkList)本身的对象中有一个字段(first)指向第一个链结点的引用.看图会清晰些. 这张表体现在代码里就两个构造类: Link(链结点类)


class Link {     public int iData;     public double dData;     public Link next; // 这个next就是链结点对象对下个链接点的引用.默认初始化为NULL     public Link(int id, double dd){         iData = id;         dData = dd;     } }

LinkList(链表类)


class LinkList {     public Link first; // 首链结点first,初始化为NULL     public  LinkList () {         first = null;     } }

就这样一个链结点指向下个链结点的引用构成了整个链表. 今天这个实例,显示了一个单链表.主要的操作如下: 在链表头插入一个数据项. 在链表头删除一个数据项. 遍历链表显示内容. 首先插入一个链接点的逻辑就是:将first的引用指向Link对象链结点的next引用,然后再将first指向这个链结点就构造了新的链表.如图
代码大框如下:

public void insertFirst(int id, double dd) {     Link newLink = new Link(id, dd); // 构造新的链结点对象     newLink.next = first; // 将链结点对象的next指向first的引用     first = newLink;      // 然后将first指向newLink对象 }

 
删除一个链结点的逻辑就是:用一个临时变量存储first的引用(即要删除的链结点)然后将first指向first.next(即他只想的链结点对象的next指向的那个链结点Link).这样要删除的那个链结点就没有了指针对他的引用.Java垃圾回收就会把他收回.实现了并返回存储的那个删除节点.如图 代码大框如下:

public Link deleteFirst() {     Link temp = first; // 暂存first引用的这个链结点(即要删除的)     first = first.next;// 将first指向他所引用的Link链接点的next引用     return temp;       // 返回要删除的链结点 }

这要弄清了,Java对象引用的关系理解起来就很容易了.下面就是实现的整个代码:

Code package com.dbstructor.oop2;
// 链接点类 class Link {     public int iData;     public double dData;     public Link next;     public Link(int id, double dd){         iData = id;         dData = dd;     }     public void displayLink(){         System.out.print("{" + iData + "," + dData + "}");     } }
// 链表First类 class LinkList {     public Link first;     public  LinkList () {         first = null;     }     public boolean isEmpty() {         return (first == null);     }     // 添加链结点     public void insertFirst(int id, double dd) {         Link newLink = new Link(id, dd); // 构造新的链结点对象         newLink.next = first; // 将链结点对象的next指向first的引用         first = newLink;      // 然后将first指向newLink对象     }     // 删除链结点     public Link deleteFirst() {         Link temp = first; // 暂存first引用的这个链结点(即要删除的)         first = first.next;// 将first指向他所引用的Link链接点的next引用         return temp;       // 返回要删除的链结点     }     // 显示链结点     public void displayList(){         Link current = first;         System.out.print("List: (first ---> last)");         while(current != null) {                 current.displayLink();             current = current.next;                     }         System.out.println();              } } public class LinkListApp {
    public static void main(String[] args) {         LinkList aLink = new LinkList();         aLink.insertFirst(22, 22.88);         aLink.insertFirst(44, 44.88);         aLink.insertFirst(66, 66.88);         aLink.insertFirst(88, 88.88);         aLink.displayList();         while(! aLink.isEmpty()){             Link removeLink = aLink.deleteFirst();                 removeLink.displayLink();                 System.out.println("  Deleted");         }         System.out.println();         aLink.displayList();     } }

打印的结果为:


List: (first ---> last){88,88.88}{66,66.88}{44,44.88}{22,22.88} {88,88.88}  Deleted {66,66.88}  Deleted {44,44.88}  Deleted {22,22.88}  Deleted List: (first ---> last)

继续扩展下添加查找对应键值和按对应键值删除链结点的find和delete方法.

find方法: 这个方法与上面的displayLink方法类似.将current定义为first,通过不断的current.next.iData与键值作比较,如果相等便返回当前引用. 如果一直到最后Null也没找到就返回Null delete方法: 这个方法需要两个变量.current:当前链结点的引用 privious:前一链结点的引用.这个方法也是通过循环查找如果找到了 .就用前一引用的next指向当前的next的引用就可以了.见图 最后代码:

Code package com.dbstructor.oop2;
// 链接点类 class Link {     public int iData;     public double dData;     public Link next;     public Link(int id, double dd){         iData = id;         dData = dd;     }     public void displayLink(){         System.out.print("{" + iData + "," + dData + "}");     } }
// 链表First类 class LinkList {     public Link first;     public  LinkList () {         first = null;     }     public boolean isEmpty() {         return (first == null);     }     // 添加链结点     public void insertFirst(int id, double dd) {         Link newLink = new Link(id, dd);          newLink.next = first;          first = newLink;           }     // 查找指定链结点     public Link find(int key) {         Link current = first;         while(current.iData != key){             if(current.next == null) {                 return null;             }else{                 current = current.next;             }         }         return current;     }          // 删除指定的链结点     public Link delete(int key) {         Link current = first;         Link privious = first;         while(current.iData != key) {             if(current.next == null) {                 return null;             }else{                 privious = current;                 current = current.next;                         }         }         if(current == first) {             first = first.next;         }else{             privious.next = current.next;         }         return current;     }
    // 显示链结点     public void displayList(){         Link current = first;         System.out.print("List: (first ---> last)");         while(current != null) {                 current.displayLink();             current = current.next;                     }         System.out.println();         } } public class LinkListApp {
    public static void main(String[] args) {         LinkList aLink = new LinkList();         aLink.insertFirst(22, 22.88);         aLink.insertFirst(44, 44.88);         aLink.insertFirst(66, 66.88);         aLink.insertFirst(88, 88.88);         aLink.displayList();         Link findLink = aLink.find(22);         System.out.print("the Find Item: ");         findLink.displayLink();         System.out.print("  the Del Item: ");         Link delLink = aLink.delete(22);         delLink.displayLink();         System.out.println();         aLink.displayList();     } }

执行结果:

List: (first ---> last){88,88.88}{66,66.88}{44,44.88}{22,22.88} the Find Item: {22,22.88}  the Del Item: {22,22.88} List: (first ---> last){88,88.88}{66,66.88}{44,44.88}

JAVA基础——链表结构之单链表的更多相关文章

  1. Java数据结构和算法(一)线性结构之单链表

    Java数据结构和算法(一)线性结构之单链表 prev current next -------------- -------------- -------------- | value | next ...

  2. Java 实现简答的单链表的功能

    作者:林子木  博客网址:http://blog.csdn.net/wolinxuebin 參考网址:http://blog.csdn.net/sunsaigang/article/details/5 ...

  3. c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)

    线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...

  4. Python与数据结构[0] -> 链表/LinkedList[0] -> 单链表与带表头单链表的 Python 实现

    单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利 ...

  5. [Java基础]循环结构3

    [Java基础]循环结构3 break 与 continue 中断循环... /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:BreakTest.java 编写时间:2016/6 ...

  6. [java基础]循环结构2

    [java基础]循环结构2 写了几个循环结构练习~记录一下~~ 1:99乘法表 /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:GameForFor.java 编写时间:2016 ...

  7. [java基础]循环结构1

    [java基础]循环结构1 循环结构:for循环,while循环,do_while循环在,增强型for循环 /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:WhileTest.j ...

  8. [java基础]分支结构(2)

    [java基础]分支结构2 switch case /** 文件路径:G:\JavaByHands\if-else\ 文件名称:switchcase.java 编写时间:2016/6/6 作 者:郑晨 ...

  9. SDUT OJ 数据结构实验之链表七:单链表中重复元素的删除

    数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...

随机推荐

  1. [办公自动化]PPT文件太大,如何压缩?

    如果你经常需要制作PPT,文件太大的确是个问题. 那么应该如何压缩呢? 以office 2007为例 第一.可以选中图片,然后双击,在弹出的菜单栏中,选择压缩图片. 然后选择选项, 有三种比例可选,建 ...

  2. FFmpeg解码视频帧为jpg图片保存到本地

    FFmpeg解码视频帧为jpg图片保存到本地 - CSDN博客 https://blog.csdn.net/qq_28284547/article/details/78151635

  3. ABAP OLE

    OLE DATA: excel TYPE ole2_object, workbook TYPE ole2_object, sheet TYPE ole2_object, cell TYPE ole2_ ...

  4. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)

    [Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...

  5. Angular学习日记(一) 开发环境的搭建

    从看视频到自己尝试,总会走很多的弯路才能成功. 首先:装最新版的nodejs. 第一种:使用npm安装 首先设置taobao镜像,npm config set registry https://reg ...

  6. VBScript+SCR+NetApi+Accoreconsole 批处理dwg文件

    继上次powershell运行accoreconsole(https://www.cnblogs.com/NanShengBlogs/p/10981687.html)的研究之后又觉得不是很合适,毕竟p ...

  7. Linux C编程之一:Linux下c语言的开发环境

    ---恢复内容开始--- 今天开始根据Linux C编程相关视频的学习所做的笔记,希望能一直坚持下去... 1.开发环境的构成 编辑器:VI: 编译器:选择GNU  C/C++编译器gcc: 调试器: ...

  8. 1.2Hello, World!的大小

    描述 还记得在上一章里,我们曾经输出过的“Hello, World!”吗? 它虽然不是本章所涉及的基本数据类型的数据,但我们同样可以用sizeof函数获得它所占用的空间大小. 请编程求出它的大小,看看 ...

  9. 转 DOS(CMD)下批处理换行问题/命令行参数换行 arg ms-dos

    DOS(CMD)下批处理换行问题本人经常写一些DOS批处理文件,由于批处理中命令的参考较多且长,写在一行太不容易分辨,所以总想找个办法把一条命令分行来写,今天终于试成功两种方法.一.在CMD下,可以用 ...

  10. 394 Decode String 字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串.编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数.你可以认 ...