直接进入主题,要想自己构建一个双向链表就得知道双向链表的构成,既然是链表,很容易让人联想到链条,其实就是和链条差不多的结构,很形象,那就让我们来看看节点的结构,图画得有些难看不要打我。
双向链表的结构:由若干个节点组成,每个节点有三个属性,一个是指向前一个节点的,一个是存储该节点数据的,一个是指向后一个节点的。从图可知,链表是由节点组成,那么就要先声明节点:
节点的声明:这里以数据类型为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; } } }
相关推荐
下面我们将详细讲解如何实现一个自定义的Java双向链表,并参考提供的`LinkNode.java`文件来理解其内部机制。 首先,我们需要定义一个表示链表节点的类`LinkNode`。这个类通常包含三个属性:存储数据的`data`字段、...
本实例聚焦于Java中的一个重要数据结构——双向链表,它在很多场景下都有着广泛的应用。双向链表与单链表相比,其独特之处在于每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针,这使得在链表中的...
本主题主要关注两种特殊类型的链表——双端链表(Double-ended LinkedList)和双向链表(Bidirectional LinkedList),并以Java语言实现为例进行讲解。 双端链表,也称为双链表,是一种允许在链表的两端进行插入和...
在计算机科学中,长整数加减法运算和双向链表是两个重要的概念,它们在数据处理和算法设计中有着广泛的应用。本文将详细探讨这两个主题,并结合它们在实际问题中的应用,帮助读者深入理解其原理和实现方法。 首先,...
《2022年Java语言中链表和双向链表Java教程》 链表作为一种基础且重要的数据结构,广泛应用于编程领域,特别是在Java语言中。虽然Java不直接提供指针,但通过对象引用,我们可以轻松地实现链表的构建。在Java中,...
本文将详细解析如何用Java实现单向链表和双向链表,并探讨它们的应用场景与优缺点。 单向链表是一种线性数据结构,其中每个元素(节点)包含一个数据部分和一个指向下一个元素的引用。在Java中,我们可以定义一个...
以下是对如何使用Java中的双向链表来构建贪吃蛇程序的详细解释。 首先,我们来看链表节点(SnakeNode)的定义。这个类是链表的基本构建块,它包含了两个整型变量`x`和`y`,分别表示节点在网格中的位置。此外,每个...
本话题涵盖了三种重要的数据结构:双向链表、二叉树以及哈弗曼树。这些数据结构在算法设计、数据库系统、编译器和各种软件开发中都有广泛应用。下面我们将深入探讨这三种数据结构的构建方法。 首先,我们来讨论双向...
1. `DoublyLinkedClass.java` - 这个文件很可能包含了一个双向链表的实现。双向链表允许每个节点不仅知道下一个节点,还知道前一个节点。这样,我们可以向前和向后遍历链表,提供了更大的灵活性。 2. `...
描述中提到的 "2013 年秋季为 cs2110 实现的 Java 双向链表" 暗示这是一个教学项目,可能是课程作业或实验,目的是让学生理解并实践如何在 Java 中构建双向链表。cs2110 可能是计算机科学或相关领域的课程代码,通常...
在Java中,`LinkedList`类就是一种常见的双向链表实现。在Memcached中,我们可以将最近最少使用的条目(LRU)放入链表头部,当缓存满时,可以从链表尾部移除最不常用的条目。这种策略保证了常用条目的快速访问,同时...
本文将深入探讨“简单的双向循环链表”,并结合提供的`LinkedList.java`源码来理解其实现原理。 双向循环链表与单向链表不同,它在每个节点中不仅保存了指向下一个节点的指针,还保存了指向前一个节点的指针,这种...
"面向对象实现带头双向链表"的主题旨在利用C语言中的结构体和指针来创建一个双向链表的数据结构,并通过面向对象的方式组织代码。以下是对这个主题的详细讲解: 首先,我们需要理解双向链表的基本概念。双向链表与...
本篇将深入探讨Java中的链表及其自定义实现,同时也会涉及双向链表和链表堆栈的实现。 首先,让我们了解链表的基本概念。链表由一系列节点组成,每个节点包含两个部分:数据域(存储元素)和指针域(指向下一个节点...
通常,这样的数据结构会包含三个主要部分:一个接口定义链表的基本操作,一个类实现这个接口来构建具体的链表结构,还有一个测试类用于验证链表功能的正确性。 首先,让我们详细了解一下循环双链表的接口。这个接口...
本项目是关于使用 Java 语言实现双向链表(DoublyLinkedList)的一个实例,同时结合了 Maven 作为项目管理工具以及 SonarQube 作为代码质量管理平台,确保代码的质量和规范性。 **Java 双向链表(DoublyLinkedList...
然后,我们可以通过创建Node对象并设置它们的prev和next指针来构建链表。在实际编程中,为了防止内存泄漏和提高代码的可读性,通常会使用智能指针(如C++中的std::shared_ptr或std::unique_ptr)来管理链表节点的...
单链表的扩展是双链表,也称为双向链表。每个节点不仅包含数据和指向下一个节点的引用,还包含一个指向前一个节点的引用。这种设计允许我们在链表中前后移动更加灵活,增加了插入和删除操作的效率,但同时也增加了...
链表分为单向链表和双向链表,这里我们讨论的是单向链表。 **案例一**: 这个案例展示了链表的基本构建。`Node`类定义了链表的节点,包含一个`name`属性和一个指向下一个节点的`next`引用。`Link`类主要用于链表的...
- **双向链表**: `LinkedList`同时支持双向链表,每个节点还包含一个指向前一个节点的引用。这使得在链表中前后移动更加灵活。 3. **链表操作** - **插入**: 在链表的特定位置插入元素,例如在开头(头部)、结尾...