单链表的优点:

  1. 长度不固定,可以任意增删。

单链表的缺点:

  1. 存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针)。

  2. 要访问特定元素,只能从链表头开始,遍历到该元素,时间复杂度为 $O(n)$。在特定的数据元素之后插入或删除元素,不涉及到其他元素的移动,因此时间复杂度为 $O(1)$。双链表还允许在特定的数据元素之前插入或删除元素。

  3. 存储空间不连续,数据元素之间使用指针相连,每个数据元素只能访问周围的一个元素(根据单链表还是双链表有所不同)。

单链表基本运算:

1.插入算法(核心)

插入算法是单链表的核心算法,掌握了这个,后面的头插法,尾插法都是so easy

下图就是显示了如何将p结点插入到q的后面

2.删除算法

删除算法其实很简单

下图是删除某个结点的后继的图示

3.建立单链表的两种方法

头插法和尾插法

使用头插法创建出的单链表是逆序的, 使用尾插法创建出的单链表则是顺序的,一般都是采用此尾插法来建立单链表

头插法简单来说,就是每次插入的结点都是在头结点的后继

尾插法则是每次插入的结点都是在链表的末尾结点的后继

4.查找算法

查找算法的关键在于结束条件

下列代码中的t!=null则是结束的条件

     Lnode t = h.next;
while(t!=null){
if(t.data==x){
System.out.println("找到");
return t;
}
t = t.next;
}
return null;

单链表的实现:

import java.util.Scanner;

public class LinkedList  implements ListIntf{
Lnode h =null;
public static String toucha = "头插法";
public static String weicha = "尾插法"; public LinkedList(String s){
//如果参数是头插法则使用头插法创建单链表,不是则使用尾插法
if(s.equals(toucha)){
h=new Lnode();
h.data = 'f';
h.next = null;
Lnode p;
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
for(int i=0;i<str.length();i++){ p = new Lnode();
p.data = str.charAt(i); p.next = h.next;
h.next = p;
}
scanner.close();
}else{
h=new Lnode();
h.data = 'f';
h.next = null; Lnode p,t;
t=h; //t用来代替头结点,同时,也就是
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
for(int i=0;i<str.length();i++){ p = new Lnode();
p.data = str.charAt(i); //接收String中的char p.next = t.next;//此条语句与p.next =null 等同
t.next = p;
t = p; // t结点一直指向链表的末尾 }
scanner.close();
}
}
public void display(){
Lnode p = h.next;
while(p!=null){
System.out.println(p.data);
p = p.next;
} }
/**
* 设置头结点
* @param _h
*/
public void setH(Lnode _h){
h=_h;
}
/**
*
* @param p 结点
* @param x 某个结点的值为x
* 将值为x的结点插入到p结点的后面
*/
public void insertElementAfter(Lnode p,char x){
Lnode t = new Lnode(x);
t.next = p.next; //这里容易忘记
p.next=t;
}
/**
*
* @param x
* @return 查找到值为x的结点
*/
public Lnode search(char x){
Lnode t = h.next;
while(t!=null){
if(t.data==x){
System.out.println("找到");
return t;
}
t = t.next;
}
return null;
}
@Override
public int size() {
int i =0;
Lnode t = h.next;
while(t!=null){
i++;
t = t.next;
}
return i;
} @Override
public void clear() {
h.next = null; } @Override
public boolean isEmpty() {
if(h.next==null){
return false;
}else{
return true;
}
}
/**
*
* @param i 需要找到的第i个结点
* @return 第i个结点
*/
public Lnode getLnode(int i){
Lnode t = h; //从头结点算起,j就是从0开始
int j =0;
while(j<i){
t = t.next;
j++;
}
if(t==null){
return null;
}else{
return t;
}
} @Override
public String get(int i) {
//取得第i个结点的值
Lnode t = h; //从头结点算起,j就是从0开始
int j =0;
while(j<i){
t = t.next;
j++;
}
//或者从第一个结点开始
/*Lnode t = h.next;
int j =1;
while(j<i){
t = t.next;
j++;
}*/
//这里需要加一个溢出处理
if(t==null){
return null;
}else{
return String.valueOf(t.data);
} } @Override
public int indexOf(String s) {
//单链表不需要复写此方法
return 0;
} @Override
public String getPre(String s) {
//单链表不需要复写此方法
return null;
} @Override
public String getNext(String s) {
// TODO Auto-generated method stub
return null;
} @Override
public void insertElementAt(String s, int i) {
// TODO Auto-generated method stub } @Override
public String remove(int i) {
//先找到第i个结点,之后再将其移出,斌返回其的数值
Lnode t = getLnode(i);
Lnode q = getLnode(i-1); //q为t的前趋
q.next = t.next; return String.valueOf(t.data);
} @Override
public String remove(String s) {
// TODO Auto-generated method stub
return null;
} }

补充一下:

在Java实现字符窗口的输入时,很多人更喜欢选择使用扫描器Scanner,它操作起来比较简单。在编程的过程中,我发现用Scanner实现字符串的输入有两种方法,一种是next(),另一种是nextLine(),这两种有以下区别:

next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。

简单地说,next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串。

nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

数据结构(java版)学习笔记(三)——线性表之单链表的更多相关文章

  1. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  2. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

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

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

  4. [数据结构 - 第3章] 线性表之单链表(C++实现)

    一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...

  5. 线性表之单链表C++实现

    线性表之单链表 一.头文件:LinkedList.h //单链表是用一组任意的存储单元存放线性表的元素,这组单元可以是连续的也可以是不连续的,甚至可以是零散分布在内存中的任意位置. //单链表头文件 ...

  6. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  7. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  8. 数据结构学习笔记 <1> 线性表

     一.线性表的抽象数据类型描述 类型名:线性表(List) 数据对象集:线性表示n(>=0)个元素构成的有序序列(a1,a2,……,an) 操作集:线性表L∈List, 整数i表示位置,元素X∈ ...

  9. C语言数据结构基础学习笔记——基础线性表

    线性表是指具有相同数据类型的n(n>=0)个数据元素的有限序列,它具有一个表头元素和一个表尾元素,并且每一个数据元素最多只有一个直接前驱和一个直接后继. 线性表的顺序存储也叫作顺序表,它的特性是 ...

随机推荐

  1. python os.walk()方法--遍历当前目录的方法

    前记:有个奇妙的想法并想使用代码实现,发现了一个坑,百度了好久也没发现的"填坑"的文章~~~~~~~~~ 那就由我来填 os.walk()支持相对路径 例如 os.walk(&qu ...

  2. 请输入一个大于7的整数,输出小于k并且至少满足下面2个条件中的1个条件的所有正整数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 22:06 * @description ...

  3. 【RL-TCPnet网络教程】第4章 RL-TCPnet网络协议栈简介

    第4章        RL-TCPnet网络协议栈简介 本章节介绍RL-TCPnet网络协议栈,让大家对 RL-TCPnet有一个整体的了解,RL-TCPnet是一款小型网络协议栈,适用于 ARM 内 ...

  4. Java两种方法实现循环报数

    问题描述: 十个猴子围成一圈选大王,依次1-3 循环报数,报到3 的猴子被淘汰,直到最后一只猴子成为大王.问,哪只猴子最后能成为大王? 方法一:Java链表 public class TestAll ...

  5. Go语言反射reflect

    目录 通过反射获取类型信息 理解反射的类型(Type)与种类(Kind) reflect.Elem() - 通过反射获取指针指向的元素类型 通过反射获取结构体的成员类型 通过反射获取值信息 使用反射值 ...

  6. Vue入门手册整理

    目录 第一章.环境搭建 第二章.目录结构 第三章.Vue调试 第四章.定义页面 附录资料 第一章.环境搭建 1.1.准备: npm: 6.9.0 (npm > 3.0) node: v10.15 ...

  7. github pages代码高亮highlighter

    github pages 一直想添加代码高亮 highlighter ,基于 jekyll 3.0 的 rouge 终于搞定了: 下载代码高亮库 在 cmd 中输入: rougify style mo ...

  8. "人机"对战:电脑太简单了,我是射手 skr~skr~skr

    9月17日,2018 世界人工智能大会在上海拉开帷幕.在 SAIL 榜单入围项目中,我看到了小爱同学.小马智行.微软小冰.腾讯觅影等等,这不仅让我大开了眼界,也不禁让我感慨 AI 的发展神速.犹记得去 ...

  9. Java的内部类真的那么难以理解?

    01 前言 昨天晚上,我把车停好以后就回家了.回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小 ...

  10. 快速搭建WebAPI(Odata+Code-First)附Odata条件查询表~

    Odata是什么? 开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准.该标准由微软发起,前三个版本1.0.2.0.3.0都 ...