链表:一种数据存储结构.学链表首先要搞懂数组,按朋友的话说,数组和链表的关系就相当于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. [计算机故障]华为手机无法连接XP系统(inf中找不到所需的段落)

    同事新买的华为手机麦芒C199,拍了些照片.结果连接电脑,没有反应. 后经打电话到华为,可以到华为官网下驱动. 地址如下: http://consumer.huawei.com/cn/support/ ...

  2. POJ 3100:Root of the Problem

    Root of the Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12060   Accepted: 6 ...

  3. [翻译]NUnit---String && Collection && File && Directory Assert (七)

    StringAssert (NUnit 2.2.3) StringAssert类提供一系列检查字符串的方法. CollectionAssert (NUnit 2.4 / 2.5) Collection ...

  4. hive使用

    运行hadoop [root@hadoop0 ~]# start-all.sh 进入命令行[root@hadoop0 ~]# hive 查询昨天的表 hive> select * from st ...

  5. Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1

    转自:http://blog.51cto.com/alinazh/1276363 在启动tomcat的时候出现错误: Line: 220 - com/opensymphony/xwork2/sprin ...

  6. openssh常用命令记录

    command description date ssh [user@]hostname[:port] 登录远程机器 2017-03-21 scp <local_file> <use ...

  7. 私有CA和证书

    证书类型 证书授权机构的证书 服务器 用户证书 获取证书两种方法 使用证书授权机构: 生成签名请求(csr ) 将csr发送给CA 从CA处接收签名 自签名的证书: 自已签发自己的公钥 openSSL ...

  8. 在Android.mk文件中输出打印消息 (转载)

    转自:http://blog.csdn.net/xiaibiancheng/article/details/8479694 在进行Android NDK的开发当中有时想看看Android.mk文件当中 ...

  9. [Swift通天遁地]二、表格表单-(1)创建自定义的UITableViewCell(单元格类)

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. 使用printf和String.format格式化输出

    格式化输出 在哪些情况下使用格式化输出: 异常打印到日志中使用格式化输出有利于排查错误原因: printf格式化 示例: public class PrintfTest { public static ...