单链表的实现---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 实现单链表
数据结构是计算机存储.组织数据的方式,结构不同那么数据的检索方式和效率都不一样, 常用的数据结构有 数组 .栈 .队列 .链表 .树.堆 今天讲下单链表,单链表是一种链式存取的数据结构, 跟顺序链表 ...
随机推荐
- window应用移植到Linux下(应用移植)
配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\ ...
- 为什么php时间阅读RTF,p标签会出现红色
为什么php读取富文本的时候,p标签会出现红线,怎么去掉,哪位大侠帮解决?跪求答案 就像以下一样,一遇到p标签就有红虚线 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- Django之逆向解析url
Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试图, 获取相应的数据 ...
- cocos2dx 制作单机麻将(一)
今天開始打算解说下cocos2dx下怎样制作国标麻将 前半部分先解说麻将的逻辑部分,由于都是代码,可能会比較枯燥无聊. 这部分讲完后,你也能够用其它游戏引擎来制作麻将 后半部分,就解说余下的cocos ...
- ubuntu/linux mint 创建proc文件的三种方法(两)
在这样做的内核驱动程序的开发时间.可以使用/proc下档.获取相应的信息.对于调试. 大多数/proc下的文件是仅仅读的.但为了演示样例的完整性.都提供了写方法. 方法一:使用create_proc_ ...
- PPTP和L2TP的区别
PPTP是点到点的隧道协议,服务器端使用TCP 的1723端口,同时使用GRE协议,加密上使用MPPE.位于NAT后的客户端连接会有问题. L2TP是二层隧道VPN,使用IPsec 进行加密,服务器端 ...
- ERROR: Error in Log_event::read_log_event(): 'read error', data_len: 438, event_type: 2
分析从库1062问题,解析从库binlog日志,报错如下 [root@xxxdb0402 tmp]# mysqlbinlog mysql-bin.004271 > 4.log ERROR: Er ...
- WebService之Soap头验证入门
1.新建一个类,如"AuthHeaderUser",继承于"System.Web.Services.Protocols.SoapHeader"类 2.新建Web ...
- android插件技术-apkplug于OSGI服务基础-08
我们提供 apkplug 下OSGI使用demo 源代码托管地址为 http://git.oschina.net/plug/OSGIService 一 OSGI与android Service 异同点 ...
- GIT分支管理是一门艺术(转)
英文原文:http://www.nvie.com/posts/a-successful-git-branching-model/ 原文作者:Vincent Driessen 本文经Linux大棚博主总 ...