- 浏览: 734630 次
- 性别:
- 来自: 嘉兴
文章分类
- 全部博客 (386)
- Struts1.1 (2)
- Database (18)
- Core Java (15)
- Log4j (4)
- SSH (0)
- Dao (1)
- Architecture Design (1)
- References (2)
- Eclipse&MyEclipse (10)
- Hibernate (7)
- Spring (8)
- JavaMail (1)
- Data Structure And Algorithm (48)
- Struts 2 (2)
- SSI (1)
- SSL (2)
- JSTL (1)
- EJB3 (2)
- NET (2)
- XML (2)
- Components (2)
- Ant (3)
- Multi Thread (1)
- Performance Monitoring (1)
- Web Server (17)
- Oracle (1)
- jQuery (8)
- Regular Expression (1)
- Weblogic (1)
- Exception (1)
- Security (2)
- File Manipulation (1)
- JavaScript (12)
- JVM (2)
- HTML&DIV&CSS (4)
- Android (10)
- Beyond GFW (0)
- Business (0)
- SVN (6)
- 虚拟主机 (1)
- Virtual Host (3)
- My mentality (5)
- OS (15)
- ISPMP (3)
- Magento (5)
- Jsoup&HttpClient (7)
- LINUX (9)
- Database Design (0)
- Power Designer (1)
- TaobaoOpenPlatform (2)
- C/C++ (3)
- Maven (11)
- Quartz (1)
- Load Balance (1)
- Zabbix (4)
- Product&Business (1)
- Pay Interface (1)
- Tomcat (2)
- Redis (1)
- 集群 (1)
- Session (1)
- 共享Session (1)
- Jedis (1)
- jenkins (1)
- 持续集成 (1)
- Web前端 (1)
最新评论
-
aqq331325797:
特意注册账号上来说一句。牛逼!
swagger2.2.2 与 spring cloud feign冲突 -
KitGavinx:
跨顶级域名怎么保持sessionid一致?
Tomcat7集群共享Session 基于redis进行统一管理 -
jaychang:
dujianqiao 写道HI ,能否给一个完整的demo 啊 ...
淘宝订单同步方案 - 丢单终结者 -
GGGGeek:
找了一会儿,感觉mybatis应该没有这种操作,直到发现博主的 ...
mybatis collection list string -
dujianqiao:
HI ,能否给一个完整的demo 啊 ?
淘宝订单同步方案 - 丢单终结者
/**
* @title <p>双向链表LinkedList</p>
* @author Jay Chang
* @version 1.0
* @date 2009.8.9
*/
public class LinkedList {
/** 结点内部类:定义结点存的内容,以及前后链接结点引用,以便实现双向链表 */
class Node {
private Object obj;
private Node(Object obj) {
this.obj = obj;
}
private Node next;
private Node prev;
}
/** 定义一个整数包装类 */
class IntegerPackage {
private IntegerPackage(int value) {
this.value = value;
}
private int value;
}
/** 链表的头尾结点 */
private Node head, rear;
/** 链表总的结点数 */
private int numOfNodes = 0;
/** 链表的构造函数 */
public LinkedList() {
head = new Node("Head");
head.prev = null;
head.next = null;
rear = head;
}
/** 在链表尾部添加结点 */
public void add(Object obj) {
Node newNode = new Node(obj);
Node p = rear;
p.next = newNode;
newNode.prev = p;
newNode.next = null;
rear = rear.next;
this.numOfNodes++;
}
/** 在链表头添加结点 */
public void addFirst(Object obj) {
Node newNode = new Node(obj);
newNode.prev = head;
newNode.next = head.next;
head.next.prev = newNode;
head.next = newNode;
}
/** 在结点尾部添加,即add() */
public void addLast(Object obj) {
add(obj);
}
/** 清除所有节点 */
public void clear() {
this.head = null;
this.rear = null;
this.numOfNodes = 0;
// 为添加结点做准备
head = new Node("Head");
head.prev = null;
head.next = null;
rear = head;
}
/** 判断是否存在某一结点值为obj,存在则返回该结点,并在包装类中设定该结点索引值 */
private Node isExist(Object obj, IntegerPackage num) {
Node iterator = this.head;
int count = num.value;
while (iterator != null) {
if (iterator.obj.equals(obj)) {
break;
} else {
iterator = iterator.next;
count++;
}
}
num.value = count;
return iterator;
}
/** 判断该链表的所有结点中是否有包含obj对象的,有的话,返回从头结点开始的第一个结点值 */
public boolean contains(Object obj) {
if (isExist(obj, new IntegerPackage(-1)) != null) {
return true;
} else {
return false;
}
}
/** 根据索引值查找相应结点的值,不存在返回null */
public Object get(int index) {
int count = 0;
Node p = this.head.next;
while (p != null) {
if (count == index)
break;
p = p.next;
count++;
}
if (p == null)
return null;
return p.obj;
}
/** 得到链表头所指向的结点的值 */
public Object getFirst() {
if (head.next != null) {
return head.next.obj;
} else {
return null;
}
}
/** 得到链表尾所指向的结点的值 */
public Object getLast() {
if (rear != null) {
return rear.obj;
} else {
return null;
}
}
/** 获得包含某一值的结点的索引 */
public int indexOf(Object obj) {
IntegerPackage count = new IntegerPackage(-1);
if (isExist(obj, count) == null) {
return -1;
}
return count.value;
}
/** 根据结点值,删除从头结点开始的第一次遇到的那个相应的结点,成功返回true,否则false */
public boolean remove(Object obj) {
Node iterator = isExist(obj, new IntegerPackage(-1));
if (iterator == null) {
return false;
}
iterator.prev.next = iterator.next;
iterator.next.prev = iterator.prev;
this.numOfNodes--;
return true;
}
/** 返回所有结点的值 */
public Object[] toArray() {
Object[] elementData = new Object[this.numOfNodes];
Node iterator = this.head.next;
int count = 0;
while (iterator != null && count != this.numOfNodes) {
elementData[count++] = iterator;
iterator = iterator.next;
}
return elementData;
}
/** 用toString()方法描述该链表对象 */
public String toString() {
String info = "[";
Node p = head.next;
while (p != null) {
info += p.obj + " ,";
p = p.next;
}
info = info.substring(0, info.length() - 1) + "]";
return info;
}
}
发表评论
-
【排序算法系列】希尔排序
2015-12-05 16:14 838希尔排序的概述: a[0]...a[n-1 ... -
归并排序
2015-06-20 15:28 896public class MergeSort { pub ... -
插入排序
2015-06-20 15:27 485/** * 插入排序1 容易理解 * * ... -
有序线性链表归并
2013-10-05 11:30 1562#include<stdio.h> #incl ... -
Trie树 应用 Phone List
2012-06-15 11:21 1179Phone List 时间限 ... -
Trie树 单词查找树 键树(JAVA版附分析说明)
2012-06-13 10:27 5177来源于英文“retrieval”. ... -
Trie树 单词查找树 键树
2012-06-12 08:59 1156转自:http://zh.wik ... -
数字金额转中文大写金额
2010-11-26 15:09 1426/** * 用来将数字金额转化成中文大写的金额 ... -
汉诺塔递归算法
2010-11-25 08:17 1353import java.util.Scanner; /* ... -
约瑟夫出圈
2010-11-24 20:45 1099#include<iostream> #incl ... -
SmartHashSet只是为了解释HashSet的原理
2010-07-26 11:11 1360写该类的目的只是为了 ... -
二叉树中序遍历非递归算法
2010-06-29 23:17 1723#include<iostream> usi ... -
二叉树的创建
2010-06-29 23:15 1134#include<iostream> usi ... -
哈弗曼树建立与哈弗曼编码
2010-06-29 23:12 1248#include<iostream> #de ... -
二叉排序树转双向链表(要求无任何新增节点)
2010-06-29 23:07 2492题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双 ... -
线索二叉树中插入结点
2010-06-29 23:05 1890#include<iostream> usi ... -
二叉排序树的递归与非递归查找
2010-06-29 22:58 2309#include<iostream> usi ... -
二叉树中序线索化及查找某一结点的前驱,后继结点
2010-06-29 22:54 2682#include<iostream> usi ... -
十字链表定义创建查找
2010-06-29 22:44 1322#include<iostream> #defi ... -
稀疏矩阵转置
2010-06-29 22:39 1663#include<iostream> #defi ...
相关推荐
在C++编程中,双向链表是一种非常重要的数据结构,它允许在列表的任一位置进行插入和删除操作,而不必像数组那样依赖于索引。在这个“支持类模版的C++双向链表”中,我们将探讨如何利用C++的模板特性来实现一个灵活...
### Linux内核双向链表简单分析 #### 链表数据结构简介 链表作为一种基本且重要的数据结构,在操作系统及各种软件系统中扮演着至关重要的角色。尤其在Linux内核中,链表更是广泛应用于内存管理、进程调度、文件...
双向链表是一种高级数据结构,它在计算机科学中被广泛应用于各种算法和程序设计中。与单链表相比,双向链表的主要特点是每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针。这种设计使得双向...
在这个特定的项目中,“C++双向链表统计文章单词出现频率”是一个涉及数据结构和算法的应用,目标是实现一个程序来分析文本文件,计算并显示文章中每个单词出现的次数。双向链表作为数据结构的核心,其特点是每个...
双向链表的操作问题 Time Limit: 1000MS Memory Limit: 10000KB Submissions: 111 Accepted: 41 Description 建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成...
本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...
双向链表是一种特殊类型的数据结构,与常见的单向链表相比,它具有更丰富的操作能力,可以支持前后两个方向的遍历。本篇文章将深入探讨如何创建双向链表以及其在增加和删除操作中的应用。 双向链表的每个节点不仅...
操作系统课程设计中实现线程安全的双向链表是一项重要的实践任务,这涉及到多线程编程、数据结构以及并发控制等核心知识点。在这个项目中,我们主要关注如何在多线程环境下构建一个能够正确操作(如插入、删除)而不...
双向链表(Double Linked List)是链表的一种变体,它允许我们在列表中的每个节点处进行前向和后向的遍历。本文将详细探讨如何实现双向链表的增、删、改、查操作,并通过C++编程语言的DLink.cpp文件进行实际应用。 ...
双向链表是一种特殊的数据结构,它在编程中具有重要的应用。本文将深入探讨双向链表的概念,实现,以及如何进行基本操作。 双向链表,顾名思义,是一种链式存储结构,其中每个节点包含两个指针,一个指向前一个节点...
在这个项目中,我们讨论的是如何在STM32F103上实现一个双向链表的数据结构。双向链表是一种特殊的数据结构,它允许我们在列表中的节点之间进行前向和后向的移动,这在处理动态数据集合时非常有用。 首先,我们要...
在编程领域,双向链表是一种数据结构,它允许在列表中的元素之间进行前向和后向的导航。这种数据结构在处理需要频繁插入、删除或遍历操作的问题时特别有用。而“n的阶乘”是数学概念,表示1到n的所有整数的乘积,记...
### 数据结构源代码之双向链表 #### 概述 本文档主要介绍如何通过C语言实现双向链表的基本操作。继单链表之后,双向链表作为一种更灵活的数据结构,支持从前向后以及从后向前的遍历。双向链表在每个节点中除了包含...
双向链表是一种特殊的数据结构,它在计算机程序设计中扮演着重要角色,特别是在C++这样的编程语言中。本节将深入探讨双向链表的概念、其结构、操作以及C++中的实现。 双向链表与单链表不同,它允许每个节点不仅有一...
本主题聚焦于如何使用双向链表这一数据结构来实现大数阶乘的计算。双向链表允许我们有效地存储和操作大数,同时保持良好的性能。 首先,我们需要了解双向链表的基本概念。双向链表是一种线性数据结构,其中每个节点...
定义、实现并测试一个双向链表结点类DNode。 链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* ...
### C++经典算法:双向链表 在计算机科学领域中,数据结构是极其重要的基础知识之一。其中链表作为一种常见的线性表实现方式,在各种应用场景中都有广泛的应用。本篇文章将根据给定的代码片段深入探讨双向链表的...
本文将深入探讨双向链表及其在C++中的模板类实现,以"双向链表模板类简单实现"为主题,我们来详细了解一下这个话题。 双向链表,与单向链表不同,它的每个节点不仅包含数据,还包含两个指针,一个指向下一个节点...
双向链表是链表的一种变体,它在每个节点中不仅存储了数据,还包含了指向前后节点的指针,这使得在链表中的导航变得更加灵活。 双向链表的结构: 在C语言中,一个双向链表的节点通常包含三个部分:数据域,以及两个...
双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材