自定异常类:
public class MyException extends Exception {
public MyException(){};
public MyException(String msg){
super(msg);
}
}
链表结点对像:
public class Node {
public Node previou=null;//前结点指针
public Node next=null; //后结点指针
public Object value;//结点值
Node(Object value){
this.value=value;
}
}
链表对像:
public class DoubleLinked {
private Node head;//链表头
DoubleLinked(){
}
/**
* 判断是否还有下一个结点,没有则为链表的尾结点
* @param node
* @return
*/
public boolean hasNext(Node node){
if(node.next==null)
return false;
return true;
}
/**
* 判断是否有上一个结点,没有则为链表的头结点
* @param node
* @return
*/
public boolean hasPrev(Node node){
if(node.previou==null)
return false;
return true;
}
/**
* 获取链表头元素
* @return
* @throws MyException
*/
public Node getHead() throws MyException{
if(head==null){
throw new MyException("链表为空");
}
return head;
}
/**
* 获取上一个接点
* @param node
* @return
*/
public Node getPrev(Node node){
return node.previou;
}
/**
* 获取下一个结点
* @param node
* @return
*/
public Node getNext(Node node){
return node.next;
}
/**
* 根据索引获取结点
* @param index:结点索引
* @return
* @throws MyException
*/
public Node getNode(int index) throws MyException{
Node curNode=null;
Node next=null;
Node node=null;
if(head==null){
throw new MyException("链表为空");
}else{
curNode=head;
for(int i=0;i<index;i++){
if(curNode==null){
throw new MyException("你要获取的元素索引大于链表长度");
}else{
node=curNode;
if(hasNext(curNode)){
next=curNode.next;
curNode=next;
}else{
curNode=null;
}
}
}
}
return node;
}
/**
* 获取最后一个结点
* @return
* @throws MyException
*/
public Node getLast() throws MyException{
Node curNode=null;
Node next=null;
Node last=null;
boolean flag=true;
if(head==null){
throw new MyException("链表为空");
}else{
curNode=head;
while(flag){
if(hasNext(curNode)){
next=curNode.next;
curNode=next;
}else{
last=curNode;
flag=false;
}
}
}
return last;
}
/**
* 在链表头添加新结点
* @param node
*/
public void addHead(Node node){
if(head==null){
head=node;
}else{
node.next=head;
head.previou=node;
head=node;
}
}
/**
* 在链表末尾处添加新结点
* @param node
* @throws MyException
*/
public void addLast(Node node) throws MyException{
if(head==null){
head=node;
}else{
Node last=this.getLast();
last.next=node;
node.previou=last;
}
}
/**
* 在链表中间插入新结点
* @param node
* @throws MyException
*/
public void insertNode(int index,Node node) throws MyException{
Node indexNode=this.getNode(index);
Node prev=indexNode.previou;
prev.next=node;
node.previou=prev;
node.next=indexNode;
indexNode.previou=node;
}
/**
* 删除链表头结点
* @return
* @throws MyException
*/
public Node deleteHead() throws MyException{
Node head=this.getHead();
if(hasNext(head)){
Node next=head.next;
this.head=next;
next.previou=null;
}
return head;
}
/**
* 删除链表的最后一个结点
* @return
* @throws MyException
*/
public Node deleteLast() throws MyException{
Node last=this.getLast();
Node prev=last.previou;
if(prev==null){
this.head=null;
}else{
prev.next=null;
}
return last;
}
/**
* 根据索引删除链表结点
* @param index
* @return
* @throws MyException
*/
public Node deleteNode(int index) throws MyException{
Node node=this.getNode(index);
Node prev=node.previou;
Node next=node.next;
if(prev==null && next!=null){
this.head=next;
next.previou=null;
}
if(prev!=null && next==null){
prev.next=null;
}
if(prev==null && next==null){
this.head=null;
}
if(prev!=null && next!=null){
prev.next=next;
next.previou=prev;
}
return node;
}
} :!:
分享到:
相关推荐
用Java定义一个双向链表,实现链表的基本操作: 初始化、获取头结点、添加新元素、删除链表元素、 获取链表元素、查找链表元素、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空链表。
用java实现双向链表的完整操作,主要用到内部类实现。
JAVA实现双向链表的增删功能的方法 本篇文章主要介绍了JAVA实现双向链表的增删功能的方法,包括了链表的创建、插入节点、删除节点等操作。下面将对相关知识点进行详细解释。 一、链表的基本概念 链表是一种数据...
主要介绍了Java实现双向链表(两个版本)的相关资料,需要的朋友可以参考下
JAVA实现链表_双向链表
本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...
Java 实现双向链表实例详解 Java 实现双向链表实例详解是一种基本的数据结构,在 Java 中 LinkedList 已经实现了这种结构,但是作为开发者,也要拥有自己显示这种结构的能力。双向链表是一种动态的数据结构,它可以...
以下是使用迭代方式实现双向链表反转的Java代码: ```java public void reverse() { if (head == null || head.next == null) { return; } Node current = head; Node previous = null; while (current != ...
数组、单链表和双链表介绍以及双向链表的C、C++和Java实现 在计算机科学中,数组、单链表和双链表是最基本的数据结构。它们都是线性表的实现方式,具有相同类型的n(n≥0)个数据元素组成的有限序列。 数组 数组是...
在Java编程中,有序非循环双向链表是一种重要的数据结构,它在许多复杂的数据操作和算法实现中扮演着核心角色。有序意味着链表中的元素按照特定的顺序排列,非循环则表示链表的首节点和尾节点之间没有链接,使得遍历...
使用 Eclipse、Maven、JUnit、SonarQube 和 JaCoCo 使用 Java 实现双向链表。 嵌套类摘要 private class DLNode 现场总结 - DLNode<T> first - DLNode<T> last 构造函数总结 + DLList() 方法总结 + boolean ...
在本文中,我们将深入探讨...这个例子展示了如何利用Java实现双向链表的高效拆分,对于理解和操作链表数据结构非常有帮助。通过这种方式,我们可以解决许多其他涉及链表操作的算法问题,例如合并排序链表或链表的反转。
下面我们将详细讲解如何实现一个自定义的Java双向链表,并参考提供的`LinkNode.java`文件来理解其内部机制。 首先,我们需要定义一个表示链表节点的类`LinkNode`。这个类通常包含三个属性:存储数据的`data`字段、...
本主题主要关注两种特殊类型的链表——双端链表(Double-ended LinkedList)和双向链表(Bidirectional LinkedList),并以Java语言实现为例进行讲解。 双端链表,也称为双链表,是一种允许在链表的两端进行插入和...
本实例聚焦于Java中的一个重要数据结构——双向链表,它在很多场景下都有着广泛的应用。双向链表与单链表相比,其独特之处在于每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针,这使得在链表中的...
在这个话题中,我们将深入探讨两种基本的线性数据结构——单链表和双向链表,并通过Java语言来实现它们。 单链表是一种线性数据结构,其中每个元素(称为节点)包含两个部分:数据域和指针域。数据域存储实际的数据...
在本文中,我们将深入探讨如何使用Java编程语言实现一个高效的双向链表数据结构,并通过测试用例进行验证。首先,让我们了解双向链表的基本概念。 双向链表是一种线性数据结构,其中每个节点包含两个指针,分别指向...
相信大家都明白 LinkedList 是基于双向链表而实现的,本篇文章主要讲解一下双向链表的实现,并且我们参考 LinkedList 自己实现一个单链表尝试一下。 什么是链表? 简单的来讲一下什么是链表:首先链表是一种线性的...
在实际开发中,Java的`java.util.LinkedList`类已经为我们提供了内置的双向链表实现。然而,理解如何自定义实现双向链表有助于深入理解数据结构和算法,对于提升编程技能和解决问题的能力大有裨益。