根据马克(啊)思主义基本原理,事物是相互联系,相互影响的,在现实生活中,很多事物往往是相互联系在一起的,双向链表使用十分广泛,接下来就创建一个简单的双向链表队列
实现带头结点的双向链表的建立、求长度,取元素、修改元素、插入、删除、置空等双向链表的基本操作。
[基本要求]
(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++实现一个基于双向循环链表的派生栈和队列。 首先,我们要理解双向循环链表的基本概念。双向循环链表是一种链式存储结构,每个节点包含数据和两个指针,分别指向其前一个节点和后一个节点...
总的来说,"双向链表的派生栈和队列,关于继承和派生以及数据结构的只是综合"这一主题提供了丰富的学习材料。通过对MyDoubleLinkedList的分析和操作,你将能够更深入地了解数据结构的复杂性和灵活性,同时巩固面向...
双向链表在许多算法和数据结构实现中都很常见,比如LRU缓存、实现堆栈或队列等。 **一、双向链表的基本结构** 双向链表中的每个节点通常由三部分组成:数据部分、指向前一个节点的指针(prev)和指向后一个节点的...
`FirstLastLinkList.java`可能是一个实现双向链表的类,其命名暗示了它主要关注链表的首尾操作,类似于栈或队列。在这个类中,我们可能会找到类似的方法,如`addFirst()`, `addLast()`, `removeFirst()`, 和 `...
双向链表因其特性,在很多算法问题中都有所应用,如LRU缓存淘汰策略、实现堆栈或队列等。熟练掌握双向链表的使用,对于提升编程能力非常有帮助。在学习过程中,可以通过编写和运行上述代码,加深对双向链表的理解。...
C语言双向链表操作是指在C语言中使用结构体来实现双向链表的操作,包括创建、销毁、查找、删除和插入操作。双向链表是一种数据结构,其中每个节点都可以向前和向后进行遍历。在C语言中,可以使用结构体来定义双向...
本文将深入探讨C语言实现的双向链表和双向循环链表,以及如何将这些概念应用于Linux内核。双向链表与单向链表相比,具有更灵活的操作特性,而双向循环链表则在此基础上增加了循环的特性,使得遍历和操作更加方便。 ...
遍历双向链表非常简单,只需要按照`prev`和`next`指针依次访问每个节点: ```c++ void DoublyLinkedList::traverse() { Node* current = head; while (current) { std::cout << current->data ; current = ...
双向链表的创建与单向链表类似,只是每个节点还需要一个prev指针,初始状态下,头节点的prev指针指向None,尾节点的next指针也指向None。 2. 插入节点: 在双向链表中插入节点,除了要更新下一个节点的引用,还要...
其次,**链表(List)**通常指的是双向链表,与单链表相比,每个节点除了有指向下一个节点的指针,还包含一个指向前一个节点的指针。这使得在链表中的插入和删除操作更为灵活。相关的宏可能包括`LIST_HEAD初始化`、`...
在某些需要频繁进行插入和删除操作的场景下,如实现高效的栈或队列,双向链表是理想的选择。 在实际开发中,Java的`java.util.LinkedList`类已经为我们提供了内置的双向链表实现。然而,理解如何自定义实现双向链表...
队列是一种先进先出(FIFO)的数据结构,而双向链表可以方便地实现队列。测试可能包括各种操作,如入队(enqueue)、出队(dequeue)、检查队首元素(peek)以及验证队列操作的正确性。 通过VC(Visual C++)编译和...
实验报告可能会涉及如何创建、遍历和修改双向链表的具体步骤。 4. **内部排序(8种)**: 内部排序是指在内存中完成的排序方法,这里提到的8种可能包括:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆...
在本文中,我们将探讨如何使用非循环双向链表来实现队列数据结构。队列是一种先进先出(FIFO)的数据结构,常用于任务调度、数据缓冲等场景。与单链表不同,非循环双向链表允许我们从两端进行操作,这在实现队列时能...
以下是一个简单的C语言实现双向链表的代码示例,包括创建节点、在链表尾部添加节点、在链表头部添加节点、删除节点、修改节点等功能: ```c #include #include typedef struct Node { int data; struct Node* ...
首先,我们来看双向链表的节点结构。在C++中,通常会定义一个名为`node`的类来表示链表中的节点。节点包含三个主要部分:元素值`m_element`、指向下一个节点的指针`m_next`以及指向前一个节点的指针`m_pre`。节点类...
数据结构双向链表的创建和读取详解及实例代码 双向链表是一种重要的数据结构,它允许用户从头部和尾部访问链表的任意节点,提高了查找和插入的效率。在本节中,我们将详细介绍双向链表的创建和读取,并提供实例代码...
2. **链表初始化**:在程序启动时,需要创建一个空的双向链表。这通常包括创建一个头节点,其前后指针都为NULL。 3. **插入操作**:当要添加新学生信息时,我们需要找到合适的位置插入新节点。这可能是在链表的开头...