`
什么世道
  • 浏览: 221553 次
  • 性别: 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;
	}

 

分享到:
评论

相关推荐

    创建双向链表_双向链表_

    在实际编程中,双向链表常用于实现高效的缓存、队列、堆栈等数据结构,以及某些高级算法,如LRU(Least Recently Used)页面替换算法。由于其灵活的插入和删除操作,双向链表在需要频繁进行这些操作的场景下特别有用...

    用C++写的双向循环链表派生栈和队列

    本文将详细讨论如何使用C++实现一个基于双向循环链表的派生栈和队列。 首先,我们要理解双向循环链表的基本概念。双向循环链表是一种链式存储结构,每个节点包含数据和两个指针,分别指向其前一个节点和后一个节点...

    双向链表的派生栈和队列,关于继承和派生以及数据结构的只是综合

    总的来说,"双向链表的派生栈和队列,关于继承和派生以及数据结构的只是综合"这一主题提供了丰富的学习材料。通过对MyDoubleLinkedList的分析和操作,你将能够更深入地了解数据结构的复杂性和灵活性,同时巩固面向...

    C++的双向链表实现

    双向链表在许多算法和数据结构实现中都很常见,比如LRU缓存、实现堆栈或队列等。 **一、双向链表的基本结构** 双向链表中的每个节点通常由三部分组成:数据部分、指向前一个节点的指针(prev)和指向后一个节点的...

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

    `FirstLastLinkList.java`可能是一个实现双向链表的类,其命名暗示了它主要关注链表的首尾操作,类似于栈或队列。在这个类中,我们可能会找到类似的方法,如`addFirst()`, `addLast()`, `removeFirst()`, 和 `...

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

    双向链表因其特性,在很多算法问题中都有所应用,如LRU缓存淘汰策略、实现堆栈或队列等。熟练掌握双向链表的使用,对于提升编程能力非常有帮助。在学习过程中,可以通过编写和运行上述代码,加深对双向链表的理解。...

    C语言 双向链表操作,普通双向和循环双向

    C语言双向链表操作是指在C语言中使用结构体来实现双向链表的操作,包括创建、销毁、查找、删除和插入操作。双向链表是一种数据结构,其中每个节点都可以向前和向后进行遍历。在C语言中,可以使用结构体来定义双向...

    c语言 链表 双向链表 双向循环链表

    本文将深入探讨C语言实现的双向链表和双向循环链表,以及如何将这些概念应用于Linux内核。双向链表与单向链表相比,具有更灵活的操作特性,而双向循环链表则在此基础上增加了循环的特性,使得遍历和操作更加方便。 ...

    双向链表源码

    遍历双向链表非常简单,只需要按照`prev`和`next`指针依次访问每个节点: ```c++ void DoublyLinkedList::traverse() { Node* current = head; while (current) { std::cout &lt;&lt; current-&gt;data ; current = ...

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

    双向链表的创建与单向链表类似,只是每个节点还需要一个prev指针,初始状态下,头节点的prev指针指向None,尾节点的next指针也指向None。 2. 插入节点: 在双向链表中插入节点,除了要更新下一个节点的引用,还要...

    各种链表队列宏操作的应用例子

    其次,**链表(List)**通常指的是双向链表,与单链表相比,每个节点除了有指向下一个节点的指针,还包含一个指向前一个节点的指针。这使得在链表中的插入和删除操作更为灵活。相关的宏可能包括`LIST_HEAD初始化`、`...

    链表的创建和输出链表的创建和输出

    8. **链表的应用**:链表常用于实现堆栈、队列、哈希表、图等高级数据结构,以及动态内存分配和编译器的符号表等。 在学习和实践链表的创建和输出时,编写和运行代码是至关重要的。通过创建不同的链表实例,插入和...

    双向链表(java实现)

    在某些需要频繁进行插入和删除操作的场景下,如实现高效的栈或队列,双向链表是理想的选择。 在实际开发中,Java的`java.util.LinkedList`类已经为我们提供了内置的双向链表实现。然而,理解如何自定义实现双向链表...

    一个双向链表管理程序

    队列是一种先进先出(FIFO)的数据结构,而双向链表可以方便地实现队列。测试可能包括各种操作,如入队(enqueue)、出队(dequeue)、检查队首元素(peek)以及验证队列操作的正确性。 通过VC(Visual C++)编译和...

    用队列和栈判断回文_赫夫曼数_双向链表_内部排序(8种).zip

    实验报告可能会涉及如何创建、遍历和修改双向链表的具体步骤。 4. **内部排序(8种)**: 内部排序是指在内存中完成的排序方法,这里提到的8种可能包括:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆...

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

    在本文中,我们将探讨如何使用非循环双向链表来实现队列数据结构。队列是一种先进先出(FIFO)的数据结构,常用于任务调度、数据缓冲等场景。与单链表不同,非循环双向链表允许我们从两端进行操作,这在实现队列时能...

    C语言实例-双向链表增删改查

    以下是一个简单的C语言实现双向链表的代码示例,包括创建节点、在链表尾部添加节点、在链表头部添加节点、删除节点、修改节点等功能: ```c #include #include typedef struct Node { int data; struct Node* ...

    双向循环链表的C++实现

    首先,我们来看双向链表的节点结构。在C++中,通常会定义一个名为`node`的类来表示链表中的节点。节点包含三个主要部分:元素值`m_element`、指向下一个节点的指针`m_next`以及指向前一个节点的指针`m_pre`。节点类...

    数据结构 双向链表的创建和读取详解及实例代码

    数据结构双向链表的创建和读取详解及实例代码 双向链表是一种重要的数据结构,它允许用户从头部和尾部访问链表的任意节点,提高了查找和插入的效率。在本节中,我们将详细介绍双向链表的创建和读取,并提供实例代码...

Global site tag (gtag.js) - Google Analytics