JAVA基础——链表结构之单链表
链结点:在链表中,每个数据项都被包含在"链结点"(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对象 }
代码大框如下:
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基础——链表结构之单链表的更多相关文章
- Java数据结构和算法(一)线性结构之单链表
Java数据结构和算法(一)线性结构之单链表 prev current next -------------- -------------- -------------- | value | next ...
- Java 实现简答的单链表的功能
作者:林子木 博客网址:http://blog.csdn.net/wolinxuebin 參考网址:http://blog.csdn.net/sunsaigang/article/details/5 ...
- c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)
线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...
- Python与数据结构[0] -> 链表/LinkedList[0] -> 单链表与带表头单链表的 Python 实现
单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利 ...
- [Java基础]循环结构3
[Java基础]循环结构3 break 与 continue 中断循环... /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:BreakTest.java 编写时间:2016/6 ...
- [java基础]循环结构2
[java基础]循环结构2 写了几个循环结构练习~记录一下~~ 1:99乘法表 /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:GameForFor.java 编写时间:2016 ...
- [java基础]循环结构1
[java基础]循环结构1 循环结构:for循环,while循环,do_while循环在,增强型for循环 /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:WhileTest.j ...
- [java基础]分支结构(2)
[java基础]分支结构2 switch case /** 文件路径:G:\JavaByHands\if-else\ 文件名称:switchcase.java 编写时间:2016/6/6 作 者:郑晨 ...
- SDUT OJ 数据结构实验之链表七:单链表中重复元素的删除
数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...
随机推荐
- 修改数据表的字符集为utf8mb4
修改数据表的字符集为utf8mb4
- MSD6A628开发资料与技术支持
MSD6A628VX/VXM是mstar推出的低成本安卓智能网络电视方案,628分两个版本,一个是内置512MB内存,一个是外挂1G内存, 安卓4.4系统,4核A7处理器,Mali450MP2 GPU ...
- 清北考前刷题day3下午好
/* 可以并查集维护 可以发现,某个联通快出现大于等于2个环,一定无法分配. 有解要么一个环,要么没有环. 一个环时答案等于点数乘2(顺时针或逆时针). 没有环是树,对于一个n个点的树,方案一定有n种 ...
- [Swift通天遁地]一、超级工具-(12)使用Toaster制作简短提示语的吐司窗口
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- LOJ#120. 持久化序列(FHQ Treap)
题面 传送门 题解 可持久化\(Treap\)搞一搞 //minamoto #include<bits/stdc++.h> #define R register #define inlin ...
- c++ isdigit函数
函数名:isdigit 函数所需头文件:#include<cstdio> 函数格式:isdigit(字符) 函数作用:判断括号内是否为1~9的数字. 例:isdigit(4) 就是true ...
- 2017杭电多校第六场1008 Kirinriki
传送门 Kirinriki Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- Manacher BestCoder Round #49 ($) 1002 Three Palindromes
题目传送门 /* Manacher:该算法能求最长回文串,思路时依据回文半径p数组找到第一个和第三个会文串,然后暴力枚举判断是否存在中间的回文串 另外,在原字符串没啥用时可以直接覆盖,省去一个数组空间 ...
- 组合数学题 Codeforces Round #108 (Div. 2) C. Pocket Book
题目传送门 /* 题意:每一次任选i,j行字符串进行任意长度前缀交换,然后不断重复这个过程,问在过程中,第一行字符串不同的个数 组合数学题:每一列不同的字母都有可能到第一行,所以每列的可能值相乘取模就 ...
- 372 Super Pow 超级次方
你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出.示例 1:a = 2b = [3]结果: 8示例 2:a = 2b = [1,0]结果: 102 ...