`
shenyu
  • 浏览: 123010 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DLink 双向双端链表

 
阅读更多

DLink 实现一个简单的双向双端链表

Link一样,假定其之存储非负整数,并提供最能反映双向双端链表特征的方法

实现时利用辅助类DNode实现,DNode是双向节点

基本添加删除数据方法

addFirst, addLast, removeFirst, removeLast

遍历方法:

hasNext, next, resetToBeforeFirst

hasPrevious, previous, resetToAfterLast

遍历时插入,删除方法

insertAfter, removeAfter

insertBefore, removeBefore

其她:

getLength, indexOf

class DNode {
	private int value;
	private DNode next;
	private DNode previous;

	DNode(int value) {
		this.value = value;
	}
	
	int getValue() {
		return value;
	}

	void setNext(DNode next) {
		this.next = next;
	}

	DNode getNext() {
		return next;
	}

	void setPrevious(DNode previous) {
		this.previous = previous;
	}

	DNode getPrevious() {
		return previous;
	}
}
 
class DLink {
	private DNode first;
	private DNode last;
	private int length;
	private boolean isBeforeFirst = true;
	private boolean isAfterLast = false;
	private DNode current;

	private static void connect(DNode previous, DNode next) {
		if(previous != null) previous.setNext(next);
		if(next != null) next.setPrevious(previous);
	}

	void addFirst(int value) {
		DNode node = new DNode(value);
		connect(node,first);
		first = node;
		if(last == null) last = node;
		length++;
	}

	void addLast(int value) {
		DNode node = new DNode(value);
		connect(last,node);
		last = node;
		if(first == null) first = node;
		length++;
	}


	int removeFirst() {
		if(first ==  null) return -1;
		int result = first.getValue();
		first = first.getNext();
		connect(null,first);
		if(first == null) last = null;
		length--;
		return result;
	}

	int removeLast() {
		if(last == null) return -1;
		int result = last.getValue();
		last = last.getPrevious();
		connect(last,null);
		if(last == null) first = null;
		length--;
		return result;
	}

	int getLength() {
		return length;
	}

	boolean hasNext() {
		if(isAfterLast) return false;
		else if(isBeforeFirst) return first != null;
		else return current.getNext() != null;
	}

	int next() {
		if(isBeforeFirst) {
			isBeforeFirst = false;
			current = first;
		} else current = current.getNext();
		if (current ==  null) isAfterLast = true;
		return current != null ? current.getValue() : -1;
	}

	void resetBeforeFirst() {
		isBeforeFirst = true;
		isAfterLast = false;
		current = null;
	}

	boolean hasPrevious() {
		if(isBeforeFirst) return false;
		else if(isAfterLast) return last != null;
		else return current.getPrevious() != null; 
	}

	int previous() {
		if(isAfterLast) {
			isAfterLast = false;
			current = last;
		} else current = current.getPrevious();
		if(current == null) isBeforeFirst = true;
		return current != null ? current.getValue() : -1;
	}

	void resetAfterLast() {
		isAfterLast = true;
		isBeforeFirst = false;
		current = null;
	}

	int removeBefore() {
		if(!hasPrevious()) return -1;
		else if (isAfterLast) return removeLast();
		else if (current.getPrevious() ==  first) return removeFirst();
		else {
			int result = current.getPrevious().getValue();
			connect(current.getPrevious().getPrevious(),current);
			length--;
			return result;
		}
	}

	int removeAfter() {
		if(!hasNext()) return -1;
		else if (isBeforeFirst) return removeFirst();
		else if (current.getNext() == last) return removeLast();
		else {
			int result = current.getNext().getValue();
			connect(current,current.getNext().getNext());
			length--;
			return result;
		}
	}

	void insertBefore(int value) {
		if(!hasPrevious()) addFirst(value);
		else if(isAfterLast) addLast(value);
		else {
			DNode node = new DNode(value);
			connect(current.getPrevious(),node);
			connect(node,current);
			length++;
		}
	}

	void insertAfter(int value) {
		if(!hasNext()) addLast(value);
		else if(isBeforeFirst) addFirst(value);
		else {
			DNode node = new DNode(value);
			connect(node,current.getNext());
			connect(current,node);
			length++;
		}
	}
	
	int indexOf(int value) {
		int i = 0;
		DNode node = first;
		while(node != null) {
			if(node.getValue() == value) return i;
			i++;
			node = node.getNext();
		}
		return -1;	
	}

}
 

 

分享到:
评论

相关推荐

    双向链表的增删改查

    本文将详细探讨如何实现双向链表的增、删、改、查操作,并通过C++编程语言的DLink.cpp文件进行实际应用。 首先,我们需要定义双向链表的节点结构。一个双向链表节点包含两个指针,分别指向其前一个节点和后一个节点...

    双向链表的建立

    双向链表的建立 双向链表是一种数据结构,它允许在链表中双向移动。双向链表的建立是通过在链表中添加指向前一个节点和后一个节点的指针来实现的。 在这篇文章中,我们将学习如何使用C语言建立一个双向链表。首先...

    双向链表的创建,查找,添加,删除

    ### 双向链表的基本操作:创建、查找、添加与删除 #### 1. 双向链表的概念 双向链表是一种线性数据结构,它允许在两个方向上进行遍历,即每个节点包含指向其前一个节点和后一个节点的指针。这种结构为在链表中插入...

    双向链表内结点的插入(C++)

    ### 双向链表内结点的插入(C++) #### 概述 本文将详细介绍如何在C++中实现双向链表中的结点插入操作。双向链表是一种数据结构,其中每个结点包含一个数据元素以及两个指针,分别指向前一个结点和后一个结点。这种...

    数据结构顺序表和4个链表的代码

    本篇将深入探讨这两种数据结构及其在C++语言中的实现,通过分析提供的代码文件(dlink.cpp、sqlist.cpp、slink.cpp、cdlink.cpp、cslink.cpp),我们可以学习到不同类型的链表以及一个顺序表的实现方式。 首先,...

    DLink路由器驱动程序

    【DLink路由器驱动程序】 DLink是一家知名的网络设备制造商,其产品线涵盖了各种类型的路由器,为家庭和企业用户提供网络连接解决方案。路由器驱动程序是确保DLink路由器正常运行的关键组件,它们是操作系统与硬件...

    DLink530tx 驱动程序

    【DLink530tx驱动程序】是一款专为DLink530tx网络适配器设计的驱动软件,它在局域网共享互联环境中扮演着至关重要的角色。DLink530tx是一款早期的以太网卡,适用于桌面电脑,通过这款驱动程序,计算机能够识别并正确...

    Dlink驱动安装工具

    【Dlink驱动安装工具】是针对Dlink品牌的网络设备,如无线路由器、调制解调器、网络适配器等,提供的一种驱动程序安装辅助工具。驱动程序在计算机硬件和操作系统之间起着桥梁的作用,确保操作系统能够正确识别并充分...

    dlink 无线配置文件

    无线路由器Dlink 530 a+ 网络配置备份文件,进入路由器后直接使用恢复功能即可。

    数据结构数组的迭代

    根据给定的信息,我们可以推断出本文主要关注的是在数据结构中的数组迭代,但实际上提供的代码示例是关于双向链表的操作。因此,我们将基于这些信息,深入探讨与数组迭代及双向链表相关的知识点。 ### 数据结构数组...

    dlink 624+固件

    dlink 624+固件,最近的升级版本

    dlink dns320 b1.02固件

    Dlink的DNS320B 双盘位网络NAS 1.02版本固件

    DLink816固件 DIR816_A1_FW101CNB02.img

    DLink816固件 DIR816_A1_FW101CNB02.img中文固件 dlink路由器固件

    dlink无线路由打印机兼容列表

    ### dlink无线路由器打印机兼容列表解析 #### 一、引言 随着网络技术的发展与办公自动化的普及,无线路由器在家庭及小型办公环境中的应用越来越广泛。为了更好地满足用户的需求,许多厂商推出了支持多种功能的...

    Dlink-dir615路由器安装说明

    Dlink-dir615路由器安装说明 详细图文说明路由器的安装设置使用

    线性表综合实验:学生成绩管理系统

    - **建立双向循环链表**:根据输入的学生信息,动态地建立一个双向循环链表,其中链表节点存储学生的信息。 - **输出学生成绩信息**:遍历双向循环链表,显示所有学生的详细信息。 - **查找指定学号的学生信息**:...

    DLINK_SMARTCONSOLEUTILITY_3.00.15_WIN.EXE

    DLINK_SMARTCONSOLEUTILITY_3.00.15_WIN.EXE,是D-Link交换机管理软件。方便配置交换机参数。

    DLINK无线网络优化设置

    适用于DLINK DIR868L双频云路由下WIFI热点5GHZ无法识别之解决方法

    dlink with CGI document

    在“dlink with CGI document”这个主题中,我们聚焦于D-Link公司如何利用CGI技术来增强其网络设备,如IP摄像头的功能。 描述中的“cgi开发!”表明我们将探讨CGI的开发过程及其在D-Link产品中的应用。CGI程序通常由...

    dlink交换机常用配置命令

    ### Dlink交换机常用配置命令解析 在现代网络架构中,Dlink交换机因其稳定性与易用性而受到广泛欢迎。对于网络工程师来说,熟练掌握Dlink交换机的配置命令至关重要,这不仅能够确保网络的高效运行,还能在遇到问题...

Global site tag (gtag.js) - Google Analytics