单链表的实现,定义为SingleLinkedList

class Node<AnyType>{        //结点Node类
public AnyType data;
public Node<AnyType> next;
public Node(AnyType d,Node<AnyType> next ){
this.data=d;
this.next=next;
}
public Node(AnyType d){
this.data=d;
this.next=null;
}
public Node(){
this.data=null;
this.next=null;
} }
public class SingleLinkedList<AnyType extends Comparable<?super AnyType>> {
int theSize;
Node<AnyType> firstNode; //定义第一个结点 public SingleLinkedList(){ //对链表初始化
this.firstNode=null;
theSize=0;
} public int getSize(){ //获取链表长度
int count=0;
if(firstNode==null) return 0;
Node<AnyType> p=firstNode;
while(p!=null){
count++;
p=p.next;
}
return count;
} public Node<AnyType> getNode(int idx){ //获取idx对应的结点
Node<AnyType> p;
if(idx<0||idx>getSize()){ //判断idx的合法性
return null;
}
else{
p=firstNode;
for(int i=0;i<idx;i++){
p=p.next;
}
return p;
}
}
public AnyType setNode(int idx,AnyType newData){ //替换单链表中idx位置的数据
Node<AnyType> p=firstNode;
if(idx<0||idx>getSize())
return null;
else{
for(int i=0;i<idx;i++)
p=p.next;
AnyType oldData=p.data;
p.data=newData;
return oldData;
}
} public boolean add(AnyType x){ //插入元素,未给出idx自动加到表尾
add(getSize(),x);
return true;
}
public void add(int idx,AnyType x){ //将元素加到idx位置
Node<AnyType> newNode=new Node<AnyType>(x);
if(firstNode==null||idx==0){ //空表
newNode.next=firstNode;
firstNode=newNode;
theSize++;
}
else if(idx>theSize+2){ //idx不合法时处理方法
System.out.println("插入失败");
}
else{
Node<AnyType> p=getNode(idx-1);
newNode.next=p.next;
p.next=newNode;
theSize++; }
}
public Boolean remove(int idx){
if(firstNode==null){ //空表
return false;
}
else if(idx==0||firstNode.next==null){ //只有一个结点或idx=0;
Node<AnyType> p=this.firstNode; //定义结点p,将头结点的值赋给p
firstNode=p.next; //令头结点为p的下一个结点,即删除头结点
theSize--;
return true;
} else{
Node<AnyType> p=getNode(idx-1);
Node<AnyType> q=p.next;
p.next=q.next;
theSize--;
return true;
}
} public int contains(AnyType x,SingleLinkedList sll){ //判断x是否在链表中
int idx=0;
Node<AnyType> p=sll.firstNode;
if(sll.firstNode==null) //空表
return -1;
while(p.data!=x){
idx++;
p=p.next;
if(p==null)
return -1;
}
return idx;
} public void moveSmall(){ //将最小元素移到链表最前端
Node<AnyType> small=firstNode;
Node<AnyType> p=firstNode;
int id=0;
for(int i=0;i<theSize;i++){
if((Integer)p.data<(Integer)small.data||(Integer)p.data==(Integer)small.data){
small=p;
id=i;
}
p=p.next;
}
remove(id);
add(0,small.data);
}
public void exchange(int x,int y){ ///交换两个相邻位置的元素
if(x>y){ //使x<y
int temp=x;x=y;y=temp;
}
if(y>getSize()-1){ //输入数据超出范围
System.out.println("数据超出范围,交换失败");
}
else if(getSize()==2){ //单链表只有两个元素
Node<AnyType> p=getNode(1);
p.next=firstNode;
firstNode.next=null;
firstNode=p;
} else if(getSize()>2&&y==getSize()-1){ //元素个数大于二,交换表尾的两个数据 Node<AnyType> p=getNode(x-1);
Node<AnyType> q=p.next;
p.next=q.next;
p.next.next=q;
q.next=null;
} else if(getSize()>2&&x==0){ //元素个数大于二,交换表头的两个数据
Node<AnyType> p=getNode(1);
firstNode.next=p.next;
p.next=firstNode;
firstNode=p;
}
else if(getSize()>3){ //元素个数大于4,交换不挨边的数据
Node<AnyType> p=getNode(x-1);
Node<AnyType> q=getNode(x);
Node<AnyType> r=getNode(y);
p.next=r.next;
q.next=p.next;
r.next=q;
p.next=r; }
} public void merge(SingleLinkedList La,SingleLinkedList Lb){ //把Lb的元素接到La尾
for(int i=0;i<Lb.getSize();i++){
Node<AnyType> p=Lb.getNode(i);
AnyType m=p.data;
La.add(m);
}
}
public static void main(String[] args) {
//验证部分
SingleLinkedList<Integer> La=new SingleLinkedList<Integer>();
SingleLinkedList<Integer> Lb=new SingleLinkedList<Integer>();
La.add(1);
La.add(2);
La.add(3);
La.add(4);
La.add(5);
La.add(6);
Lb.add(11);
Lb.add(12);
Lb.add(13);
System.out.println("长度为:"+La.getSize());
for(int i=0;i<La.getSize();i++){
System.out.println(La.getNode(i).data);
}
System.out.println("........................"); La.setNode(3,0);
La.remove(0);
System.out.println("长度为:"+La.getSize());
for(int i=0;i<La.getSize();i++){
System.out.println(La.getNode(i).data);
}
System.out.println("........................"); La.add(2,9);
System.out.println("长度为:"+La.getSize());
for(int i=0;i<La.getSize();i++){
System.out.println(La.getNode(i).data);
}
System.out.println("........................"); System.out.println("结果:"+La.contains(91,La));
System.out.println("........................"); La.merge(La,Lb);
for(int i=0;i<La.getSize();i++){
System.out.println(La.getNode(i).data);
}
System.out.println("........................"); System.out.println("长度为:"+La.getSize());
La.exchange(1,2);
for(int i=0;i<La.getSize();i++){
System.out.println(La.getNode(i).data);
} }
}

单链表的实现---SingleLinkedList的更多相关文章

  1. 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

    链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表.   一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...

  2. Java数据结构-03单链表(二)

    在之前我们封装了一些操作在接口类中,并在抽象类实现了相同的方法.下面我们开始写代码: 无头结点单链表:(注意下面的AbstractList是之前抽取的类,不是java.util包下的类) public ...

  3. C#数据结构与算法系列(四):链表——单链表(Single-LinkedList)

    1.介绍: 链表是有序的列表,但是它在内存的存储如下:  链表是以节点的方式来存储,链式存储 每一个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表 ...

  4. 单链表---java实现

    单链表优点:1.不需要预先给出元素个数. 2.单链表插入删除时不需要移动数据元素. 单链表缺点:1.每个节点有指针,空间利用率低. 2.单链表不支持随机读取数据. Node.java package ...

  5. "《算法导论》之‘线性表’":基于数组实现的单链表

    对于单链表,我们大多时候会用指针来实现(可参考基于指针实现的单链表).现在我们就来看看怎么用数组来实现单链表. 1. 定义单链表中结点的数据结构 typedef int ElementType; cl ...

  6. "《算法导论》之‘线性表’":基于指针实现的单链表

    对于单链表的介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1. 单链表介绍 单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针.   ...

  7. 单链表ADT

    本博客第一篇学术性博客,所以还是写点什么东西: 首先这篇博客以及以后的博客中的代码尽量百分之90是自己写过的: 可能有部分图片和代码是我认为别人更好的故摘抄下来, 本人三观正确,所以一定会表明来源: ...

  8. 单链表数据结构 - java简单实现

    链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点.每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值.如图就是一个单向链表 一个单向链 ...

  9. PHP 实现单链表

    数据结构是计算机存储.组织数据的方式,结构不同那么数据的检索方式和效率都不一样, 常用的数据结构有  数组 .栈 .队列 .链表 .树.堆 今天讲下单链表,单链表是一种链式存取的数据结构, 跟顺序链表 ...

随机推荐

  1. MVC多语言应用

    MVC多语言应用 最近发现资源文件是个好东西, 用的好了可以给开发人员借阅不少的时间. 例如做一个多语言的网站, 资源文件就有不小的用处. 这里以MVC4模版项目的登录页为例, 简单说一下过程: 1. ...

  2. C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名

    原文:C# 文件操作(全部) 追加.拷贝.删除.移动文件.创建目录 修改文件名.文件夹名 本文也收集了目前最为常用的C#经典操作文件的方法,具体内容如下:C#追加.拷贝.删除.移动文件.创建目录.递归 ...

  3. HTML5游戏开发进阶指南

    <HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.)    译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...

  4. 【PLSQL】绑定变量,活跃SQL,软硬解析解析

    ************************************************************************   ****原文:blog.csdn.net/clar ...

  5. 王立平--Unity中间GUI Skin

    C#文字: public class NewBehaviourScript2 : MonoBehaviour { public Texture t; public GUISkin skin; // U ...

  6. struts(三)——struts框架实现登录示例

    前两篇讲解了struts框架的基本实现,自己感觉讲的也有些枯燥,今天拿登录的例子来做一个实现. 1.新建一个javaweb项目,并将struts的jar包拷贝到WebRoot/WEB-INF/lib下 ...

  7. java中由类名和方法名字符串实现其调用【反射机制】

    js里通过eval()函数,在知道某个方法名是可以实现调用该方法,那么在java里边又怎么实现的呢? java里边是通过反射机制来实现,代码如下: import java.lang.reflect.M ...

  8. HDU 2825 AC自动机+DP

    题意:一个密码,长度为 n,然后有m个magic words,这个密码至少由k个magic words组成. 问这个密码可能出现的总数. 思路:首先构造AC自动机,由于m很小,才10 ,我们可以使用二 ...

  9. 最简单的Java框架

    框架framework的目的是定义骨架式方案,处理各种相同的底层细节:而开发人员使用框架时,能够依照自己的需求实现自己的功能--仅仅须要填入自己的东西/flesh. 最简单的框架,类似于JUnit,它 ...

  10. 用KnockoutJS实现ToDoMVC代码分析

    体验地址 Knockout 版todo web app在线体验 http://todomvc.com/examples/knockoutjs/ 源码地址 项目源码地址,此地址包含了各种JS框架实现的t ...