/**
* Link节点 有数据项和next指向下一个Link引用
*/
class Link {
private int iData;// 数据
private double dData;// 数据
public Link next;// 下一个link节点的引用 public int getiData() {
return iData;
} public Link(int i, double d) {
iData = i;
dData = d;
} public String toString() {
return "[" + iData + "," + dData + "]";
} public void displayLink() {
System.out.println(toString());
}
} /**
* 链表类 维护一个头节点
*/
class LinkList {
private Link first; /**
* 初始化的时候头结点置空
*/
public LinkList() {
first = null;
} /**
* 头结点是空代表链表为空
*
* @return
*/
public boolean isEmpty() {
return first == null;
} /**
* 向链表头插入Link节点
*
* @param link
*/
public void insertFirst(Link link) {
link.next = first;// 要插入的节点的next指针指向链表的头节点
first = link;// 链表的头结点指向被插入的节点
} /**
* 从链表头删除头结点并返回
*
* @return
*/
public Link deleteFirst() {
Link temp = first;// temp临时存上头结点
first = first.next;// 将头节点的next指针指向下一个节点
return temp;// 返回temp
} @Override
public String toString() {
if (isEmpty())
return "{}";
StringBuilder sb = new StringBuilder();
sb.append("{");
Link current = first;
while (current != null) {
sb.append(current.toString());
sb.append(",");
current = current.next;
}
sb.deleteCharAt(sb.length() - 1);
sb.append("}");
return sb.toString();
} /**
* 根据key寻找节点
*
* @param key
* @return
*/
public Link find(int key) {
Link curr = first;
while (curr.getiData() != key) {
if (curr.next == null)
return null;
else
curr = curr.next;
}
return curr;
} /**
* 根据key值删除节点
*
* @param key
* @return
*/
public Link deleteByKey(int key) {
Link current = first;
Link previous = first;
// 根据key值遍历
while (current.getiData() != key) {
if (current.next == null)//找不到,返回null
return null;
else {
previous = current;
current = current.next;
}
}
//找到,此时头结点就是要删除的节点,直接把头结点置为头结点的next节点
if (current == first)
first = first.next;
else//找到,此时把前一个节点的next指向当前节点的next即可
previous.next = current.next;
return current;
} public void displayList() {
System.out.println(toString());
}
} public class LinkListDemo {
public static void main(String[] args) {
LinkList ll = new LinkList();
for (int i = 0; i < 10; i++) {
Link l = new Link(i, i + 11.23);
ll.insertFirst(l);
ll.displayList();
}
ll.deleteFirst();
ll.deleteFirst();
ll.displayList();
Link l3 = ll.find(3);
System.out.println("key 为3的节点是: "+l3.toString());
ll.deleteByKey(3);
System.out.print("删除该节点后,链表是:");
ll.displayList();
}
}

《Java数据结构与算法》笔记-CH5-链表-2单链表,增加根据关键字查找和删除的更多相关文章

  1. Java数据结构和算法之链表

    三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...

  2. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

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

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

  4. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

  5. java 数据结构与算法---链表

    原理来自百度百科  一.链表的定义 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运 ...

  6. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

  7. java数据结构和算法06(红黑树)

    这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的 ...

  8. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

  9. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

随机推荐

  1. boot.img的分析

    1 boot.img  boot.img是由文件头信息,内核数据以及文件系统数据组成,它们之间非页面对齐部分用0填充 文件头信息的具体结构可以在system/core/mkbootimg/bootim ...

  2. 关于Qt

    什么是Qt Qt是一个针对桌面.嵌入式.移动设备的一个跨平台的应用程序开发框架,支持的平台包括Linux.OS X.Windows.VxWorks.QNX.Android.iOS.BlackBerry ...

  3. 用AngularJS开发下一代Web应用 系列入门基础教程

    开篇介绍 AngularJS是什么东西?我觉得不用再描述了.可自行去充电一下.按照惯例,让我们先看看一个Hello World的开门简介吧. <!doctype html> <htm ...

  4. 51nod1204 Parity

    如果sm[j]和sm[i]奇偶性相同,那么(i+1,j)个数为偶数如果奇偶性相同看成是朋友,不同的看成是敌人,那么就跟bzoj1370的做法差不多了. 如果奇偶性相同,就将x和y合并,x+n,y+n合 ...

  5. python练习程序(c100经典例9)

    题目: 要求输出国际象棋棋盘. for i in range(1,9): for j in range(1,9): if i%2==0: if j%2==0: print '*', else: pri ...

  6. 【C#学习笔记】Hello World

    using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { Conso ...

  7. [转载] FFMpeg的码率控制

    mediaxyz是一位研究ffmpeg有三年的高人了,这几天一直在折腾ffmpeg中的x264,就是不知道该如何控制码率,主要是参数太多,也不知道该如何设置,在google上search了一下,这方面 ...

  8. Java 中方法的重载

    问: 什么是方法的重载呢? 答: 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方法名称都为 show , ...

  9. vs2012编译出错“LC.exe”已退出解决方法

    “LC.exe”已退出,代码为 -1. 解决方法: 将项目Properties下的licenses.licx文件删除,重新编译即可.

  10. Cent OS5.2安装Hyper-V集成光盘

    一.Hyper-V安装windows系统没有问题,windows2000以后系统都可以,一切顺利. 驱动程序:IDE.SCSI.网络.视频和鼠标 要想实现更强的功能,宿主机需要安装Hyper-V集成光 ...