`
宝剑锋梅花香
  • 浏览: 6956 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论
阅读更多



      直接进入主题,要想自己构建一个双向链表就得知道双向链表的构成,既然是链表,很容易让人联想到链条,其实就是和链条差不多的结构,很形象,那就让我们来看看节点的结构,图画得有些难看不要打我。  

 

     双向链表的结构:由若干个节点组成,每个节点有三个属性,一个是指向前一个节点的,一个是存储该节点数据的,一个是指向后一个节点的。从图可知,链表是由节点组成,那么就要先声明节点:

     节点的声明:这里以数据类型为String类型来举例

    

/**
	 * 定义节点类
	 * @author Administrator
	 *
	 */
	class Node{
		String data;
		Node next;
		Node front;
		/**
		 * 构造函数
		 * @param data 节点的数据 
		 */
		public Node(String data)
		{
			this.data=data;
		}	
	}

       声明好节点后就可以来声明链表类了:

       双向链表的属性:

             Node   head;------------>头节点

             Node   tail;--------------->尾节点

             int        count;----------->计算节点个数

     既然是链表就得有一些方便我们用的方法:增、删、改、查

     上代码:         

package jhf.linklist;


/**
 * 我的链表类
 * 双向链表
 * @author Administrator
 *
 */
public class MyLinkList {
	
	Node head;//头节点
	Node tail;//尾节点
	int count;//节点的个数
	/**
	 * 添加指定元素到链表的尾部
	 * @param s  要添加的元素
	 */
	public void add(String s)
	{
		//根据元素创建一个新节点
		Node n=new Node(s);
		if(head==null)
		{
			head=n;
		}else{
			
			tail.next=n;
			n.front=tail;
		}
		tail=n;
		count++;
	}
	/**
	 * 取出指定位置的节点
	 * @param index  要取出节点的位置
	 * @return  返回的是该位置的节点
	 */
	public Node getNode(int index)
	{
		//下标越界处理
		if (index < 0 || index >= size()) {
			throw new RuntimeException("下标越界");
		}
		int num = 0;// 寻找的下标
		Node n=head;//从头结点开始寻找
		while (n != null) {
			if (num == index) {
				break;
			}
			num++;
			n = n.next;
		}
		
		return n;
	}
	
	/**
	 * 根据下标得到元素值的方法
	 * @param index  要得到元素的下标
	 * @return  返回的是这个元素的值
	 */
	public String  get(int index)
	{
		//下标越界处理
		if (index < 0 || index >= size()) {
			throw new RuntimeException("下标越界");
		}
		int num = 0;// 寻找的下标
		Node n=head;//从头结点开始寻找
		while (n != null) {
			if (num == index) {
				break;
			}
			num++;
			n = n.next;
		}
		// 获得该节点的元素
		String s = n.data;
		
		return s;
	}
	/**
	 * 根据元素值得到这个节点的方法
	 * @param s   元素
	 * @return  与该值相对应的节点
	 */
	public Node getNode(String s)
	{
		int unm=0;//计数器
		String ss=head.data;
		if(s==ss){//如果要找的就是头节点
			//System.out.println("已经得到下标"+unm);测试得到的下标是否正确时用的语句
			Node n=getNode(unm);//根据下标得到节点  该方法已经在上面实现并测试挣钱  可以直接调用 
			//System.out.println("找到元素:"+n.data+"的节点啦!");测试找到的元素是否正确的时候用的语句
			return head;
		}
		else//如果找到的不是头节点
		{
			unm=1;
			ss=get(unm);
			while(ss!=s)
			{
				if(ss==s) break;
				unm++;
				ss=get(unm);
			}
		}
		//System.out.println("已经得到下标"+unm);测试得到的下标是否正确时用的语句
		Node n=getNode(unm);//根据下标得到节点  该方法已经在上面实现并测试挣钱  可以直接调用 
		//System.out.println("找到元素:"+n.data+"的节点啦!");测试找到的元素是否正确的时候用的语句
		return n;
		
	}
	/**
	 * 将指定的元素添加到指定的位置
	 * @param s  要添加的元素
	 * @param index  要添加到的位置
	 */
	public void add(String s,int index)
	{
		//判断下标是否越界
		if (index < 0 || index >= size()) {
			throw new RuntimeException("下标越界");
		}
		int num= 0;//用来寻找的下标
		Node n=head;//从头节点开始寻找
		while(n!=null){
			if(num==index){
				break;
			}
			num++;
			n=n.next;
		}
		Node nn=new Node(s);
		if(n==tail)
		{
			n.next=nn;
			nn.front=n;
			tail=nn;
		}else{
		nn.next=n.next;
		n.next.front=nn;		
		n.next=nn;
		nn.front=n;
		}
		count++;
		
	}

	/**
	 * 删除指定位置的元素
	 * @param s  要删除的元素的下标
	 */
	public void delete(int index)
	{
		Node n=getNode(index);
		if(n==tail)//如果找到的该节点是尾节点
		{
			n.front.next=null;	
		}else{
		n.front.next=n.next;
		n.next.front=n.front;
		}
		count--;
	}
	/**
	 * 删除指定元素
	 * @param s  要删除的元素
	 */
	public void delete(String s){
		Node n=getNode(s);
		if(n==tail)//如果找到的该节点是尾节点
		{
			n.front.next=null;	
		}else{
		n.front.next=n.next;
		n.next.front=n.front;
		}
	count--;
	
	}
	
	
	
	 public int size(){
		return count;
	}
	
	// 传入头节点取出链表中的所有元素
		public void printList(Node n) {
			if (n != null) {
				String s = n.data;
				System.out.println(s);
				printList(n.next);
			}
		}
	
	
	
	/**
	 * 定义节点类
	 * @author Administrator
	 *
	 */
	class Node{
		String data;
		Node next;
		Node front;
		/**
		 * 构造函数
		 * @param data 节点的数据 
		 */
		public Node(String data)
		{
			this.data=data;
		}	
	}

}

 

 

  • 大小: 127.1 KB
2
1
分享到:
评论

相关推荐

    Java双向链表的实现

    下面我们将详细讲解如何实现一个自定义的Java双向链表,并参考提供的`LinkNode.java`文件来理解其内部机制。 首先,我们需要定义一个表示链表节点的类`LinkNode`。这个类通常包含三个属性:存储数据的`data`字段、...

    Java算法实例-双向链表操作

    本实例聚焦于Java中的一个重要数据结构——双向链表,它在很多场景下都有着广泛的应用。双向链表与单链表相比,其独特之处在于每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针,这使得在链表中的...

    双端链表和双向链表Java代码

    本主题主要关注两种特殊类型的链表——双端链表(Double-ended LinkedList)和双向链表(Bidirectional LinkedList),并以Java语言实现为例进行讲解。 双端链表,也称为双链表,是一种允许在链表的两端进行插入和...

    长整数加减法运算 双向链表

    在计算机科学中,长整数加减法运算和双向链表是两个重要的概念,它们在数据处理和算法设计中有着广泛的应用。本文将详细探讨这两个主题,并结合它们在实际问题中的应用,帮助读者深入理解其原理和实现方法。 首先,...

    2022年Java语言中链表和双向链表Java教程.docx

    《2022年Java语言中链表和双向链表Java教程》 链表作为一种基础且重要的数据结构,广泛应用于编程领域,特别是在Java语言中。虽然Java不直接提供指针,但通过对象引用,我们可以轻松地实现链表的构建。在Java中,...

    java 单,双向链表自己做的

    本文将详细解析如何用Java实现单向链表和双向链表,并探讨它们的应用场景与优缺点。 单向链表是一种线性数据结构,其中每个元素(节点)包含一个数据部分和一个指向下一个元素的引用。在Java中,我们可以定义一个...

    java中使用双向链表实现贪吃蛇程序源码分享

    以下是对如何使用Java中的双向链表来构建贪吃蛇程序的详细解释。 首先,我们来看链表节点(SnakeNode)的定义。这个类是链表的基本构建块,它包含了两个整型变量`x`和`y`,分别表示节点在网格中的位置。此外,每个...

    双向链表,二叉树,哈弗曼树的构建

    本话题涵盖了三种重要的数据结构:双向链表、二叉树以及哈弗曼树。这些数据结构在算法设计、数据库系统、编译器和各种软件开发中都有广泛应用。下面我们将深入探讨这三种数据结构的构建方法。 首先,我们来讨论双向...

    链表(数据结构--Java版)

    1. `DoublyLinkedClass.java` - 这个文件很可能包含了一个双向链表的实现。双向链表允许每个节点不仅知道下一个节点,还知道前一个节点。这样,我们可以向前和向后遍历链表,提供了更大的灵活性。 2. `...

    DoublyLinkedList.Java:Java 中的双向链表

    描述中提到的 "2013 年秋季为 cs2110 实现的 Java 双向链表" 暗示这是一个教学项目,可能是课程作业或实验,目的是让学生理解并实践如何在 Java 中构建双向链表。cs2110 可能是计算机科学或相关领域的课程代码,通常...

    构建高性能服务(一)ConcurrentSkipListMap和链表构建高性能Java Memcached

    在Java中,`LinkedList`类就是一种常见的双向链表实现。在Memcached中,我们可以将最近最少使用的条目(LRU)放入链表头部,当缓存满时,可以从链表尾部移除最不常用的条目。这种策略保证了常用条目的快速访问,同时...

    简单的双向循环链表

    本文将深入探讨“简单的双向循环链表”,并结合提供的`LinkedList.java`源码来理解其实现原理。 双向循环链表与单向链表不同,它在每个节点中不仅保存了指向下一个节点的指针,还保存了指向前一个节点的指针,这种...

    面向对象实现带头双向链表.zip

    "面向对象实现带头双向链表"的主题旨在利用C语言中的结构体和指针来创建一个双向链表的数据结构,并通过面向对象的方式组织代码。以下是对这个主题的详细讲解: 首先,我们需要理解双向链表的基本概念。双向链表与...

    java 链表,仅供参考

    本篇将深入探讨Java中的链表及其自定义实现,同时也会涉及双向链表和链表堆栈的实现。 首先,让我们了解链表的基本概念。链表由一系列节点组成,每个节点包含两个部分:数据域(存储元素)和指针域(指向下一个节点...

    基于java的循环双链表

    通常,这样的数据结构会包含三个主要部分:一个接口定义链表的基本操作,一个类实现这个接口来构建具体的链表结构,还有一个测试类用于验证链表功能的正确性。 首先,让我们详细了解一下循环双链表的接口。这个接口...

    DoublyLinkedList:使用 Maven 和 SonarQube 实现双向链表的 Java

    本项目是关于使用 Java 语言实现双向链表(DoublyLinkedList)的一个实例,同时结合了 Maven 作为项目管理工具以及 SonarQube 作为代码质量管理平台,确保代码的质量和规范性。 **Java 双向链表(DoublyLinkedList...

    双向循环链表

    然后,我们可以通过创建Node对象并设置它们的prev和next指针来构建链表。在实际编程中,为了防止内存泄漏和提高代码的可读性,通常会使用智能指针(如C++中的std::shared_ptr或std::unique_ptr)来管理链表节点的...

    Java语言编写的数据结构-链表实现

    单链表的扩展是双链表,也称为双向链表。每个节点不仅包含数据和指向下一个节点的引用,还包含一个指向前一个节点的引用。这种设计允许我们在链表中前后移动更加灵活,增加了插入和删除操作的效率,但同时也增加了...

    Java链表实现三例绝对经典.doc

    链表分为单向链表和双向链表,这里我们讨论的是单向链表。 **案例一**: 这个案例展示了链表的基本构建。`Node`类定义了链表的节点,包含一个`name`属性和一个指向下一个节点的`next`引用。`Link`类主要用于链表的...

    java链表

    - **双向链表**: `LinkedList`同时支持双向链表,每个节点还包含一个指向前一个节点的引用。这使得在链表中前后移动更加灵活。 3. **链表操作** - **插入**: 在链表的特定位置插入元素,例如在开头(头部)、结尾...

Global site tag (gtag.js) - Google Analytics