`
宝剑锋梅花香
  • 浏览: 6732 次
  • 性别: 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面试题最全集

    构建一个connect pool,然后再调用它, 8.j2ee平台与dotnet平台的区别 9.ejb的life cycle 10.session bean 和 entity bean的区别 11.ejb中的transaction机制 12.synchronized (生产者和消费) 13.String 和 ...

    java 面试题 总结

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出Session...

    java8源码-interview:面试

    双向链表 常见题 树 二叉树 基础 递归的先序、中序、后序 o(n) 非递归的先序、中序、后序(复杂)o(n) 层次遍历 o(n) 常见题: 检查是否为平衡二叉树(高度差不超过1),o(n) 给定有序数组创建二叉查找树 o(log(n)) ...

    datastructure:用java语言描述的数据结构

    datastructure 用java语言描述的数据结构 ...2.链表 -&gt; LinkedList 双向链表 3.栈 (1)线性栈 (2)链栈 4.队列 (1)线性队列 (2)循环队列 (3)链表队列 5.二叉树 (1)二叉树的构建 (2)二叉树的遍历 (3)二叉树的特性算法

    java8看不到源码-l33tc0de:我对Leetcode问题的解决方案!

    您将需要使用双向链表和哈希映射来获得两个操作的 O(1) 时间复杂度。 堆栈 队列 堆 组合生成 回溯 第 5 周 树木 图表 第 6 周 编码练习 编写一个简单的预分叉回显服务器,无需查看参考。 编写多线程归并

    JAVA课程设计(1).doc

    " "通过这次设计,要求掌握以下内容: " "面向对象技术中的继承与多态(重载和覆盖)机制、各种修饰符的使用 " "类、包、接口的定义与使用 " "常用工具类与算法的实现(数组、向量、字符串、链表) " "Java常用标准...

    java初级开发面试笔试题-cpp-practice:一些练习C++问题集,主要取自http://www.programcreek.com/2

    端口,它需要一个可以从地图访问的手动双向链表节点结构。 预约范围 appointment_ranges是我用于面试的问题的完整解决方案。 我通常使用视觉辅助(“PM 艺术”)来为问题设置舞台,尽管它首先要求候选人设计将用作...

    Java单链表源码分析-algorithms_and_data_structures:我用JavaScript语言实现的经典算法和数据结构

    双向链表 哈希表 堆 队列 堆 细绳 图形 二叉树 算法 即将推出... 概念 记忆 要了解数据结构,有必要对内存分配的工作原理有一个基本的了解,以便更好地了解数据结构对其底层数据执行的各种操作的时空影响。 内存是有...

    javalruleetcode-LeetCode:LeetCode问题解决方案

    双向链表和映射,因为映射将提供 O(1) 的获取和放置,并且从链表的末尾删除节点并移动到头部也是 O(1) 两个堆栈,inputStack 和 minStack。 在任何给定的时间点,minStack 将保持最小元素直到现在(推送或弹出值) ...

    超级有影响力霸气的Java面试题大全文档

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出...

    TaskMenu菜单

    TaskMenu 3.0 &lt;br&gt; 新特点: (1) 重新设计的数据结构,使用了更合理的双向链表,代替了旧版本的父子包含结构,更容易以后扩展。 (2) 重新设计了控制函数接口,更方便使用者。 (3) 通过重写css样式文件...

    datastructures:算法和流行数据结构的例子

    数据结构 以多种编程语言实现的算法和流行数据结构示例,经过全面测试。 要构建项目,请使用gradle build ##Algorithms ###Merge Sort 和 Inversion Count | | | | #... | | |1.1.2 可变双向链表| Java| | JavaScript |

Global site tag (gtag.js) - Google Analytics