`
海王子1994
  • 浏览: 45404 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java中单链表之浅析

 
阅读更多

       何谓链表?百度下可以知道链表是一种物理存储上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

       以我的理解,我们可以这样看:其中的每一个结点就是一个加锁的盒子,盒子里面有一把装着另一个盒子的钥匙(通过钥匙能找到并打开盒子),那个盒子被附上next的标志;盒子里还装着本身拥有的物品即数据data;由这么多一系列盒子组成的就是链表,我们可以通过每一个盒子找到相应下一个盒子,然后反复······此外,最前面的盒子和最后面的盒子被贴上root和end的标签,即表头和表尾,而且规定凡是被贴上这两类标签的盒子不加锁!!如此我们便能通过表头和表尾的盒子寻找到其他所有的盒子了。当然这个比喻是对单链表而言啦,至于其他链表,我们可以类推下去。

     既然谈到链表是由一系列结点组成的,那我们首先自然得创建一个结点类哈:

public class Node<E> {
   
	public Node<E> next;  //定义节点后一个节点
	public Node<E> forward;//定义节点前一个节点
	public Object data;//定义节点储存的数据
}

 然后得创建一个链表类,其中要有如下属性;节点类型的root(根结点)和end(尾结点)还有整型的size(链表长度)。接着我们就写其中几种方法:

 

      1.向表尾添加数据                                    2.删除指定位置的数据

      3.向指定位置删除数据                             4.获取指定位置的数据

      5.获取链表长度

public class Link<E> {
   
	private Node<E> root;//创建根节点
	private Node<E> end;//创建尾部节点
	private int size;//创建链表长度变量
	
	public void add(Object obj)
	{
		Node<E> node=new Node<E>();//创建一个对象
		node.data=obj;//将添加的内容赋给节点
		//如果根节点为空
		if(root==null)
		{
			root=node;//创建的节点地址传给根节点地址
			end=node;//创建的节点地址传给尾节点地址
		}
		else{
			end.next=node;//创建的节点地址传给尾节点内的节点
			end=node;//把创建的节点作为尾节点
			
		}
		size++;
	}
	//删除指定位置上的数据
	public Object remove(int index)
	{
		
		if(index<0||index>size)
		{
			throw new java.lang.ArrayIndexOutOfBoundsException("索引位置超出队列范围");
		}
		//如果队列只有一个数据
		if(size==1)
		{   size--;
			Object obj=root.data;
			root=null;
			return obj;
		}
		
		//如果索引为0
		if(index==0)
		{
			Object obj=root.data;
			root=root.next;
			return obj;
			
		}
		//创建临时节点,使其不断被赋成此后节点的值,相当于指针
		Node<E> temp=root;
		for(int i=0;i<index-1;i++)
		{
			temp=temp.next;
		}
		Object obj=temp.next.data;
		temp.next=temp.next.next;
		//如果索引指向最后一个节点,则
		if(index==size-1)
		{
			end=temp;
		}
		size--;
        return obj;		
        
	}
	//向指定位置插入数据
	public void insert(Object obj,int index)
	{
		Node<E> node=new Node<E>();
		node.data=obj;
		
		 if(index<0||index>size)
		   {
			 //如果索引超出索引范围
			   throw new java.lang.ArrayIndexOutOfBoundsException("索引超出队列范围!!!");//抛出异常
		   }
		 
		size++;
		
		if(index==0)
		{
           //插到表头
			
			node.next=root;
			root=node;			
			
		}
		else{
		//创建临时节点,用于访问各个节点
		Node<E> temp=root;
		for(int i=0;i<index-1;i++)
		{
			temp=temp.next;
		}
		node.next=temp.next;
		temp.next=node;
		

		}
	}
	 //查找指定位置上的数据
	public Object get(int index)
	{
	   if(index<0||index>size)
	   {
		 //如果索引超出索引范围
		   throw new java.lang.ArrayIndexOutOfBoundsException("索引超出队列范围!!!");//抛出异常
	   }
	   	   Node<E> temp=root;
		   for(int i=0;i<index;i++)
		   {
			   temp=temp.next;
		   }
		   return temp.data;
	   
	}
	//获得队列长度
	public int size()
	{
		return size;
	}
	

}

  其中我们可以发现有出现下面的代码:

 

if(index<0||index>size)
	   {
		 //如果索引超出索引范围
		   throw new java.lang.ArrayIndexOutOfBoundsException("索引超出队列范围!!!");//抛出异常
	   }

 当索引位置超出链表长度内的范围,我们自然实现不了,但是系统不会报错。为了提示出错,我们要调用java中的异常类发出警告!!

 

为了让大家更清楚了解其中几种方法的原理,现配图如下:

 

1)这是插入新结点的原理:让新结点指向索引位置前一个结点的next,然后索引位置后一个结点指向新结点的next,这样便能实现了!

2)删除指定位置的结点原理:让指定位置结点后一个结点直接指向指定位置结点前一个结点的next,这样就能越过指定位置的结点而直接寻找后面的结点了!


 
 接下来我们再创建一个实现类,就能利用所创建的链表了:

public class MyLink extends Link {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
         MyLink ml=new MyLink();//实例化对象
         for(int i=0;i<8;i++)
         {
        	 ml.add(i);
         }
        ml.printLink(ml);
        System.out.println("");
        System.out.println("删除的数据为:"+ml.remove(7));
        ml.insert(3, 0);
        ml.insert(5, 4);
        ml.printLink(ml);
         
	}
	/*
	 * 打印队列的方法
	 */
    public void printLink(MyLink ml)
    {
    	 for(int i=0;i<ml.size();i++)
         {
        	 System.out.print(ml.get(i));
         }
    }
}

 

 

  • 大小: 4.5 KB
  • 大小: 3.8 KB
1
0
分享到:
评论
2 楼 ayaome 2014-03-23  
使用泛型后Obejct就可以用E代替了
1 楼 ayaome 2014-03-23  

相关推荐

    高职数据结构教学中单链表实践教学研究.pdf

    单链表作为数据结构课程中的核心内容之一,不仅在理论上有重要的位置,而且在实际应用中也非常广泛。单链表是一种线性数据结构,由一系列节点组成,每个节点包含数据域和指向下一个节点的指针域。在高职层次的数据...

    java链表实现

    在Java编程语言中,链表是一种重要的数据...以上就是关于Java语言中单链表实现的知识点,涵盖了链表的基本概念、类结构、操作方法以及实际应用。理解这些概念有助于更好地设计和优化程序,特别是在处理动态数据集时。

    Java中单表和多表级联的增删改查

    "Java中单表和多表级联的增删改查"这个主题涵盖了基础的数据库操作以及更复杂的关联查询技术。以下是对这些知识点的详细解释: 1. **单表的增删改查(CRUD)**: - **Create(创建)**: 在Java中,通常使用JDBC...

    JAVA中单例模式的几种实现方式.doc

    ### JAVA中单例模式的几种实现方式 #### 1. 线程非安全的基本实现方式 单例模式是设计模式中的一种常用形式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式可以通过多种方式来...

    SinglyLinkedList:Java中单向链表的简单实现

    在Java中,单向链表(Singly Linked List)由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用。这种数据结构不支持随机访问,但插入和删除操作通常比数组更快,因为它们只需要改变相邻节点的...

    链表的基本操作插入查询删除

    链表的基本操作插入查询删除 算法思想: 先初始化单链表,然后建立单链表。 建立输出函数,用于输出链表中各个元素的值 建立查找函数,用于查找链表中是否有这个元素 建立插入函数,用于在链表中有序地插入输入的一...

    java单向链表代码实现

    下面我们将深入探讨Java中单向链表的实现、操作以及其在软件开发中的应用。 首先,我们来创建一个表示链表节点的类,通常命名为`Node`。这个类将包含两个属性:`data`用于存储数据,`next`用于指向下一个节点。 ``...

    浅析C++中单链表的增、删、改、减

    理解和掌握链表的基本操作是每个程序员的基础技能之一,这对于理解和实现更复杂的数据结构,如二叉树、图等都至关重要。通过不断的实践和学习,我们可以熟练地运用单链表解决各种问题,提高程序的效率和灵活性。

    浅谈Java中单例设计模式之构造方法私有化.pdf

    单例设计模式在Java中是一种广为应用的设计模式,它的核心在于将类的构造方法私有化,从而实现对类实例化过程的控制。这种模式确保了在一个应用程序中,某个类只能产生一个实例对象,有助于限制对象的数量,并且能够...

    C++中单链表的建立与基本操作

    单链表的基本操作之一是追加结点。这通常涉及到在链表末尾添加新的结点。由于链表只有一个头指针`head`,所以需要从头开始遍历,直到找到最后一个结点(表尾)。追加结点的步骤如下: 1. 分配内存空间,创建新的结点...

    单链表的创建、插入、删除

    头插法是从链表头部开始插入新节点,使新节点成为链表的新头部。 ```c void creat_touchafa(LinkList L, int n) { int i; LinkList p; // 初始化链表头结点 L = (LinkList)malloc(sizeof(LNode)); L-&gt;next = ...

    java单向链表的实现实例

    这个实例演示了Java中单向链表的基本操作,对于实际开发中涉及链表的数据结构问题,提供了很好的学习素材。不过,需要注意的是,此实现中删除节点的功能并不完整,只能删除头节点,对于删除链表中其他位置的节点,...

    java单例模式实例

    在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

    java单点登录流程及其他

    Java 单点登录流程及其他 Java 单点登录(SSO)是指在多个系统或应用程序中,只需要用户登录一次,就可以访问所有相关系统或应用程序的机制。单点登录 OOS(Object-Oriented Security)通常包括身份验证...

    java 中单例模式饿汉式与懒汉式的对比

    java 中单例模式饿汉式与懒汉式的对比 java 中单例模式是保证一个类仅有一个实例,并提供一个访问它的全局访问点的设计模式。单例模式有以下特点:单例类只能有一个实例,单例类必须自己自己创建自己的唯一实例,...

    数据结构中关于单链表的程序

    ype &e){LinkList p=L, q;int j=0;while(p&&j){p=p-&gt;next;++j;}if(!p||j&gt;i-1) return ERROR;...同时,这个程序也可以作为进一步扩展的基础,例如实现更复杂的链表操作,如反转链表、合并两个有序链表等。

    单链表简单实例

    数据结构中单链表的一个小实例,能帮助您理解单链表的形式构造,免费下载的说

    单链表的建立、插入和删除cpp.cpp

    单链表的建立、插入和删除cpp.cpp

Global site tag (gtag.js) - Google Analytics