`
什么世道
  • 浏览: 219433 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

简单双向链表队列的创建

阅读更多

根据马克(啊)思主义基本原理,事物是相互联系,相互影响的,在现实生活中,很多事物往往是相互联系在一起的,双向链表使用十分广泛,接下来就创建一个简单的双向链表队列

 

实现带头结点的双向链表的建立、求长度,取元素、修改元素、插入、删除、置空等双向链表的基本操作。

[基本要求]

 (1)依次添加节点数据,建立带头结点的双向链表;

 (2)打印双向链表中的数据元素

 (3)求双向链表的长度;

 (4)根据指定条件能够取元素和修改元素;

 (5)实现在指定位置插入和删除元素的功能。

 (6)链表置空操作

 

 

首先,定义一个双向链表节点类

/**
 * 定义一个双向链表的节点类
 * @author YangKang 
 *
 */
public class DoublyNode {
	private Object data;//节点内的数据对象
	private DoublyNode child;//对下一个节点的引用
	private DoublyNode parent;//对上一节点的引用
	//在创建节点对象的时候就传入节点中的数据对象
	public DoublyNode (Object data) {
		this.data = data;
	}
	
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	public DoublyNode getChild() {
		return child;
	}
	public void setChild(DoublyNode child) {
		this.child = child;
	}
	public DoublyNode getParent() {
		return parent;
	}
	public void setParent(DoublyNode parent) {
		this.parent = parent;
	}	
}

 

 

然后定义双向链表队列(主函数用来测试其功能)

 

/**
 * 定义一个简单的双向链表
 * @author YangKang 2013.07.16
 *
 */
public class DoublyNodeList {
	public static DoublyNode root = null;//根节点
	public static DoublyNode last = null;//最后一个节点
	
	public static void main(String[] args) {
		//加入节点
		DoublyNodeList list = new DoublyNodeList();
		//从链表最后添加节点,先进先出
		list.add("aa");
		list.add("bb");
		list.add("cc");
                //插入节点
		list.insertDoublyNode(1, "000");
		//链表队列置空
		list.setNull();
		list.add("aa");
		list.add("bb");
		list.add("cc");
	        //插入节点
		list.insertDoublyNode(2, "000");
		//删除节点
		list.deleteDoublyNote(3);
		//遍历节点
		list.printDoublyNodeList(root);
	}
 

 

 

在尾部增加节点

 

	/**
	 * 在尾部增加节点
	 * @param obj :插入的节点对象
	 */
	public void add(Object obj){
		DoublyNode node = new DoublyNode(obj);
		if(null == root){
			root = node;
			last = root;
		}else{
			last.setChild(node);
			node.setParent(last);
			last = node;
		}
	}
 

 

 

在指定索引下插入节点

 

/**
	 * 在指定索引下插入节点
	 * @param index :(索引值)第几个节点(从零开始)
	 * @param obj :需要插入的节点对象
	 */
	public void insertDoublyNode(int index,Object obj){
		if((this.getLength() < index)||(index < 0)){
			throw new java.lang.RuntimeException("下标越界:" + index + ",最大长度:" +this.getLength());
		}
		else{
			//创建一个新节点
			DoublyNode newNode = new DoublyNode(obj);
			//得到当前的索引位置的节点
			DoublyNode node = this.getDoublyNode(index);
			if(index == 0){
				//若链表中没有节点,则插入的节点作为根节点
				root = newNode;
			}
			else{
				//得到父节点
				DoublyNode fNode = node.getParent();
				//加入待插入的节点,设置新的引用关系
				fNode.setChild(newNode);
				newNode.setParent(fNode);
			}
			//设置新的引用关系
			newNode.setChild(node);
			node.setParent(newNode);
		}	
	}

 

根据索引删除节点

 

/**
	 * 根据索引删除节点
	 * @param index : (索引)第几个节点(从零开始)
	 */
	public void deleteDoublyNote(int index){
		if((this.getLength() < index)||(index < 0)){
			throw new java.lang.RuntimeException("下标越界:" + index + ",最大长度:" +this.getLength());
		}
		else{
			//得到当前索引位置的节点
			DoublyNode node =this.getDoublyNode(index);
			//得到父节点
			DoublyNode fNode = node.getParent();
			//得到父节点
			DoublyNode cNode = node.getChild();
			//设置新的索引关系
			if (fNode == null){
				root = cNode;
			}else if(cNode == null){
				fNode.setChild(null);
			}else {
				fNode.setChild(cNode);
				cNode.setParent(fNode);
			}
		}
	}
 

 

 

根据索引取出节点

 

/**
	 * 根据索引取出节点
	 * @param index :第几个节点(从零开始索引)
	 * @return :根据索引返回的节点
	 */
	public DoublyNode getDoublyNode(int index){
		if((this.getLength() < index)||(index < 0)){
			throw new java.lang.RuntimeException("下标越界:" + index + ",最大长度:" +this.getLength());
		}
		else{
			int num = 0;
			DoublyNode node = root;
			while (num != index){
				node = node.getChild();
				num++;
			}
			return node;
		}
		
	}
	
 

 

 

 得到链表的长度

/**
	 * 得到链表的长度
	 * @return 链表的长度
	 */
	public int getLength(){
		int count = 0;//内部计数器,可以不受多线程的影响
		if(root == null){
			return count;
		}
		DoublyNode node = root.getChild();
		
		while (null != node){
			count++;
			node = node.getChild();
		}
		return count + 1;
	}

 

 

修改对象节点

	/**
	 * 修改对象节点	
	 * @param index 对象节点的索引	
	 * @param obj	修改对象内容
	 */
	public void ReviseDoublyNode(int index,Object obj){
		if(this.getLength() < index || index < 0){
			throw new java.lang.RuntimeException("下标越界:" + index + ",最大长度:" +this.getLength());
		}else{
			//得到当前索引的位置
			DoublyNode node = this.getDoublyNode(index);
			node.setData(obj);
		}
	}

 

 

遍历链表的方法

 

/**
	 * 遍历链表的方法
	 * @param root :链表的根节点
	 */
	public void printDoublyNodeList(DoublyNode root){
		if (null != root ){
			Object data = root.getData();
			System.out.println(data);
			DoublyNode temp = root.getChild();
			printDoublyNodeList(temp);
		}
	}

 

链表置空操作:

/**
	 * 链表置空操作
	 */
	public void setNull(){
		root = null;
		last = null;
	}

 

分享到:
评论

相关推荐

    Python单向链表和双向链表原理与用法实例详解

    主要介绍了Python单向链表和双向链表原理与用法,结合实例形式详细分析了单向链表与双向链表的概念、原理以及创建、添加、删除等相关操作技巧,需要的朋友可以参考下

    C语言使用非循环双向链表实现队列

    我们使用一种比较特殊的链表——非循环双向链表来实现队列。首先这里的说明的是构建的是普通的队列,而不是循环队列。当我们使用数组的时候创建循环队列是为了节省存储空间,而来到链表中时,每一个节点都是动态申请...

    C语言 表、栈和队列详解及实例代码

    C语言 表、栈和队列详解 表ADT  形如A1,A2,A3…An的表,这个表的大小为n,而大小为0的表称为空表,非空表中,Ai+1后继Ai,Ai-1前驱Ai,表ADT的相关操有...链表的结构有很多种,单向链表、双向链表、循环链表、有无表

    常见数据结构的实现

    内容包括:链表,循环链表,栈,双向队列,队列的链表实现方式,队列的栈实现方式,排序二叉树的创建,插入,删除,显示,销毁,查找等,带测试函数,所有函数均测试通过,参考的是严蔚敏的数据结构与算法跟算法导论

    ToolKit是一套应用于嵌入式系统的通用工具包

    使用双向链表,超时统一管理,不会因为增加定时器而增加超时判断代码。 Event 事件集 支持动态、静态方式进行事件集的创建与删除。 每个事件最大支持32个标志位。 事件的触发可配置为**“标志与”和“标志或”**。

    约瑟夫环leetcode-algorithm-and-data-structure:数据结构-java版ANDleetcode刷题

    约瑟夫环 leetcode data-structure ...包括:双向链表的添加、遍历、修改、删除 延伸出单向环形链表 解决约瑟夫斯问题:com.imyiren.datastructure.linkedlist.JosephuQuestion 包括:环形链表的创建,节

    数据结构C-C++代码实现.rar

    最近几天在CSDN问答板块冒泡,很多同学都烦恼于数据结构实现的问题,所以我就把我实现过的结构代码发一下,希望能帮助到有需要的同学。...双向链表.cpp 顺序表cpp 拓扑排序.cpp 线索二叉树.cpp 栈.cpp

    基于C语言贪吃蛇游戏代码

    基于C语言的游戏开发,贪吃蛇由双向链表和队列构成选用队列非常贴切,每当蛇吃到苹果时 就会创建一个新蛇身,当蛇移动时蛇尾则要被删除 相较新生成的蛇身而言蛇尾是生成较早的蛇身 典型的先进先出的数据结构,...

    Delphi算法与数据结构 源码(上)

    3.2双向链表 3.3链表的优缺点 3.4栈 3.5队列 3.6小结 .第4章查找 4.1比较例程 4.2顺序查找 4.3二分查找 4.4小结 第5章排序 5.1排序算法 5.2排序基础知识 5.3小结 第6章随机算法 6.1随机数生成 6.2其他...

    Delphi算法与数据结构 源码(下)

    3.2双向链表 3.3链表的优缺点 3.4栈 3.5队列 3.6小结 .第4章查找 4.1比较例程 4.2顺序查找 4.3二分查找 4.4小结 第5章排序 5.1排序算法 5.2排序基础知识 5.3小结 第6章随机算法 6.1随机数生成 6.2其他...

    C语言实现数据结构算法初阶算法

    C语言实现数据结构算法初阶算法:顺序表、单向链表、双向循环链表、栈、队列、二叉树的遍历、创建哈夫曼树、求解哈夫曼编码。

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    7.9 动态双向链表的应用 7.10 判断完全二叉树 7.11 动画模拟创建二叉树 7.12 打印符号三角形 7.13 递归函数的非递归求解 7.14 任意长度整数加法 第8章 数值计算问题 8.1 递推化梯形法求解定积分 8.2 求解低阶定积分...

    数据结构笔记

    这是一个基于C语言的数据结构讲义,里面包含了如何创建堆栈、队列、双向循环链表、线性二叉树,以及一些算法的介绍,冒泡排序、快速排序、选择排序、插入排序、二分法查找...

    Vscode安装leetcode插件-msl:madlabsC++标准库

    单链表、双向链表和循环链表 向量、堆栈和队列的基于数组的实现。 基于链表的堆栈、队列、出队实现。 链接二叉树 使用列表实现优先队列 使用堆实现优先队列 哈希表实现 二叉搜索树实现 与上述所有相关的代码包含在...

    DataStructuresHomework1

    数据结构课程中的作业分配:创建双向链表使用调整数组大小创建堆栈使用链接列表创建队列

    吉林大学数据结构上机实验全套完整代码

    吉林大学数据结构上机实验全套完整代码,单链表、队列、栈、二叉树查找节点、二叉树的创建、好后缀、集合减法、模式匹配、三元组表减法、双向循环链表

    leetcode部分排序类-algorithm:自学习算法

    很简单,既可以用数组实现也可以用双向链表实现最好将数组用于 RandomizedQueue。 如果使用双向链表,注意空指针异常 第 3 周 作业:共线点 我的分数是81 重复项目不重要 尝试快速方法时要小心,因为排序会永远改变...

    front-end-interview-code:一些前端编程题

    在指定空间中创建对象数组去重时间格式化获取字符串长度邮箱字符串判断颜色字符串转换字符串转为驼峰格式字符串字符统计剑指offer二维数组中的查找替换空格从尾到头打印链表重建二叉树用两个栈实现队列旋转数组的...

    C语言版数据结构与算法分析-严蔚敏经典视频教程

    06-002习题课:链表、双向循环链表的相关基本操作 06-003习题课:栈的基本操作、KMP算法回顾 06-004二叉树的定义、性质与存储结构 06-005二叉树的前序、中序和后序遍历的递归与非递归算法 06-006统计二叉树中叶子...

    嵌入式操作系统ucos的学习要点复习要点.doc

    为了加快对任务控制块的访问速度:除了任务控制块链表创建成双向链表外在uC/OS-Ⅱ的uCOS-Ⅱ.H中还定义了一个OS_TCB*类型的数组OSTCBTb1[]专门用来存放指向各任务控制块的指针。 删除一个任务的实质:把任务的控制块...

Global site tag (gtag.js) - Google Analytics