链表:一种数据存储结构.学链表首先要搞懂数组,按朋友的话说,数组和链表的关系就相当于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. 简易 DBUtil 封装

    Dao包结构图: 1.首先连接数据库 package com.util.db; import java.sql.Connection; import java.sql.DriverManager; i ...

  2. YTU 2626: B 统计程序设计基础课程学生的平均成绩

    2626: B 统计程序设计基础课程学生的平均成绩 时间限制: 1 Sec  内存限制: 128 MB 提交: 427  解决: 143 题目描述 程序设计基础课程的学生成绩出来了,老师需要统计出学生 ...

  3. poj 2762(tarjan缩点+判断是否是单链)

    Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19234 ...

  4. go语言---defer

    go语言---defer https://blog.csdn.net/cyk2396/article/details/78885135 defer 是在函数退出前调用,多个defer遵循 先进后出 的 ...

  5. 什么是需求Bug、设计Bug、功能bug?

    首先什么是需求Bug.设计Bug.功能bug? 需求Bug,指由于客户需求描述不清晰或错误.需求收集人员自身原因及需求本身模糊难于分析.获取等原因,导致客户需求获取不准确,后期产品不能满足客户.用户的 ...

  6. Python Flask Web 框架入门

    Python Flask 目录 本文主要借鉴 letiantian 的文章 http://www.letiantian.me/learn-flask/ 一.简介 二.安装 三.初始化Flask 四.获 ...

  7. IntelliJ IDEA 缓存和索引介绍

    转自:https://www.cnblogs.com/zhanghaibinblogs/p/6722061.html IDEA 在首次加载项目的时候都会创建索引,IDEA 的缓存和索引主要是用来加快文 ...

  8. 【171】IDL读取HDF文件

    ;+ ;:Description: ; Describe the procedure. ; ; Author: DYQ 2009-7-19; ; ;- PRO TEST_READHDF COMPILE ...

  9. [App Store Connect帮助]五、管理构建版本(3)在您提交以供审核前选择构建版本

    在提交 App 至“App 审核”前,请(从您为该版本上传的所有构建版本中)选择您想要提交的版本.一个 App Store 版本仅可关联一个构建版本.但是,在提交该版本至“App 审核”之前,您可以任 ...

  10. SQL Server触发器创建、删除、修改、查看示例步骤

    一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...