单链表的实现---SingleLinkedList
单链表的实现,定义为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的更多相关文章
- 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...
- Java数据结构-03单链表(二)
在之前我们封装了一些操作在接口类中,并在抽象类实现了相同的方法.下面我们开始写代码: 无头结点单链表:(注意下面的AbstractList是之前抽取的类,不是java.util包下的类) public ...
- C#数据结构与算法系列(四):链表——单链表(Single-LinkedList)
1.介绍: 链表是有序的列表,但是它在内存的存储如下: 链表是以节点的方式来存储,链式存储 每一个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表 ...
- 单链表---java实现
单链表优点:1.不需要预先给出元素个数. 2.单链表插入删除时不需要移动数据元素. 单链表缺点:1.每个节点有指针,空间利用率低. 2.单链表不支持随机读取数据. Node.java package ...
- "《算法导论》之‘线性表’":基于数组实现的单链表
对于单链表,我们大多时候会用指针来实现(可参考基于指针实现的单链表).现在我们就来看看怎么用数组来实现单链表. 1. 定义单链表中结点的数据结构 typedef int ElementType; cl ...
- "《算法导论》之‘线性表’":基于指针实现的单链表
对于单链表的介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1. 单链表介绍 单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针. ...
- 单链表ADT
本博客第一篇学术性博客,所以还是写点什么东西: 首先这篇博客以及以后的博客中的代码尽量百分之90是自己写过的: 可能有部分图片和代码是我认为别人更好的故摘抄下来, 本人三观正确,所以一定会表明来源: ...
- 单链表数据结构 - java简单实现
链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点.每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值.如图就是一个单向链表 一个单向链 ...
- PHP 实现单链表
数据结构是计算机存储.组织数据的方式,结构不同那么数据的检索方式和效率都不一样, 常用的数据结构有 数组 .栈 .队列 .链表 .树.堆 今天讲下单链表,单链表是一种链式存取的数据结构, 跟顺序链表 ...
随机推荐
- API - 微云
API - 微云 1.接口说明 2.数据上传协议说明 1. 接口说明 文件上传申请,成功会返回实际上传的地址. 根据申请上传返回的地址,组织数据上传. 1.1 URL OAuth2.0协议: http ...
- stm32f103 TIM1初始化--定时器应用
//TIM1 分频 #define TIM1_DIV1 (1-1) #define TIM1_DIV2 (2-1) #define TIM1_DIV4 (4-1) #define TIM1_DIV8 ...
- VSTO之旅系列(五):创建Outlook解决方案
原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...
- 蜗牛—JSONJ学习ava转变
最近,写网站管理员,使用异步通信技术,所使用的方法是JSON数据传输模式 需要以下jar文件 然后,自己写了一点点经常使用代码 Java的List和数组要用JSONArray对象 Map和实体用JSO ...
- 该项目的建设maven片:4.协调和依赖,spring依赖注入demo
源码下载 协调 <groupId>com.demo.animal</groupId> <artifactId>animal-core</artifactId& ...
- c++map按value排序--将map的pair对保存到vector中,然后写比较仿函数+sort完成排序过程。
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行 ...
- 利用SVNKit进行版本库的树的导出
public List searchByTree(String userName,String passwd,String SVNServerUrl,String dirUrl){ //这里有点像 s ...
- Beginning Python From Novice to Professional (4) - 演示样本格式字符串
$ gedit price.py #!/usr/bin/env python width = input('Please enter width: ') price_width = 10 item_w ...
- NPOI 创建Excel,数据读取与写入
<1> using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- Deploy 11.2.0.3 RAC+DG on Windows 2008 R2 Step by Step
环境规划: 节点1: tc1 192.168.56.101 内存:2G 节点2: tc2 192.168.56.102 内存:2G 物理备库:tcdg192.168.56.108内存:1.5G 操作系 ...