数据结构-双链表
2015-11-10 18:05
465 查看
http://www.cnblogs.com/skywang12345/p/3561803.html
public class DoubleLink<T>{
private DNode<T> mHead;
private int mCount;
class DNode<T>{
private DNode prev;
private DNode next;
private T value;
public DNode(T value,DNode prev,DNode next){
this.value = value;
this.prev = prev;
this.next = next;
}
}
public DoubleLink(){
mHead = new DNode<T>(null, null, null);
mHead.prev = mHead.next = mHead;
mCount = 0;
}
public int size(){
return mCount;
}
public boolean isEmpty(){
return mCount == 0;
}
private DNode<T> getNode(int index){
if(index < 0 || index >= mCount){
throw new ArrayIndexOutOfBoundsException();
}
if(index <= mCount/2){
DNode<T> node = mHead.next;
for(int i = 0;i < index; i++){
node = node.next;
}
System.out.println("t1:" +node.prev.value + " " + node.value+" " + node.next.value);
return node;
}
DNode<T> prveNode = mHead.prev;
int pIndex = mCount -index -1;
for(int i= 0;i < pIndex;i++){
prveNode = prveNode.prev;
}
System.out.println("t2:" +prveNode.prev.value + " " + prveNode.value+" " + prveNode.next.value);
return prveNode;
}
public DNode<T> get(int index){
return getNode(index);
}
public T getFirst(){
return getNode(0).value;
}
public T getLast(){
if(isEmpty()){
throw new ArrayIndexOutOfBoundsException();
}
return getNode(mCount-1).value;
}
/**
* 在之前插入
* @param index
* @param value
*/
public void insert(int index,T value){
if(index == 0){
DNode<T> dnt = new DNode<T>(value, mHead, mHead.next);
mHead.next.prev = dnt;
mHead.next = dnt;
mCount++;
return;
}
DNode<T> dnt= getNode(index);
DNode<T> pDnt = new DNode<T>(value,dnt.prev,dnt);
dnt.prev.next =pDnt;
dnt.prev =pDnt;
mCount++;
return;
}
public void insertFirst(T value){
insert(0, value); }
public void append(T value){
if(isEmpty()){
insertFirst(value);
}else{
DNode<T> lastNode = getNode(mCount -1);
DNode<T> node = new DNode<T>(value,lastNode,lastNode.next);
lastNode.next.prev = node;
lastNode.next = node;
mCount++;
//lastNode.next.prev = node;
}
}
public void del(int index){
DNode<T> node = getNode(index);
node.prev.next = node.next;
node.next.prev = node.prev;
node = null;
mCount --;
return;
}
public void delFirst(){
del(0);
}
public void delLast(){
del(mCount -1);
}
public static void main(String[] args) {
DoubleLink<Integer> dlink = new DoubleLink<Integer>();
dlink.insertFirst(30);
dlink.insert(0,20);
dlink.insert(0,10);
dlink.insert(1, 15);
dlink.insert(3, 25);
dlink.append(40);
dlink.append(50);
dlink.del(1);
for (int i=0; i<dlink.size(); i++){
System.out.println("dlink("+i+")="+ dlink.get(i).value);
}
}
}
public class DoubleLink<T>{
private DNode<T> mHead;
private int mCount;
class DNode<T>{
private DNode prev;
private DNode next;
private T value;
public DNode(T value,DNode prev,DNode next){
this.value = value;
this.prev = prev;
this.next = next;
}
}
public DoubleLink(){
mHead = new DNode<T>(null, null, null);
mHead.prev = mHead.next = mHead;
mCount = 0;
}
public int size(){
return mCount;
}
public boolean isEmpty(){
return mCount == 0;
}
private DNode<T> getNode(int index){
if(index < 0 || index >= mCount){
throw new ArrayIndexOutOfBoundsException();
}
if(index <= mCount/2){
DNode<T> node = mHead.next;
for(int i = 0;i < index; i++){
node = node.next;
}
System.out.println("t1:" +node.prev.value + " " + node.value+" " + node.next.value);
return node;
}
DNode<T> prveNode = mHead.prev;
int pIndex = mCount -index -1;
for(int i= 0;i < pIndex;i++){
prveNode = prveNode.prev;
}
System.out.println("t2:" +prveNode.prev.value + " " + prveNode.value+" " + prveNode.next.value);
return prveNode;
}
public DNode<T> get(int index){
return getNode(index);
}
public T getFirst(){
return getNode(0).value;
}
public T getLast(){
if(isEmpty()){
throw new ArrayIndexOutOfBoundsException();
}
return getNode(mCount-1).value;
}
/**
* 在之前插入
* @param index
* @param value
*/
public void insert(int index,T value){
if(index == 0){
DNode<T> dnt = new DNode<T>(value, mHead, mHead.next);
mHead.next.prev = dnt;
mHead.next = dnt;
mCount++;
return;
}
DNode<T> dnt= getNode(index);
DNode<T> pDnt = new DNode<T>(value,dnt.prev,dnt);
dnt.prev.next =pDnt;
dnt.prev =pDnt;
mCount++;
return;
}
public void insertFirst(T value){
insert(0, value); }
public void append(T value){
if(isEmpty()){
insertFirst(value);
}else{
DNode<T> lastNode = getNode(mCount -1);
DNode<T> node = new DNode<T>(value,lastNode,lastNode.next);
lastNode.next.prev = node;
lastNode.next = node;
mCount++;
//lastNode.next.prev = node;
}
}
public void del(int index){
DNode<T> node = getNode(index);
node.prev.next = node.next;
node.next.prev = node.prev;
node = null;
mCount --;
return;
}
public void delFirst(){
del(0);
}
public void delLast(){
del(mCount -1);
}
public static void main(String[] args) {
DoubleLink<Integer> dlink = new DoubleLink<Integer>();
dlink.insertFirst(30);
dlink.insert(0,20);
dlink.insert(0,10);
dlink.insert(1, 15);
dlink.insert(3, 25);
dlink.append(40);
dlink.append(50);
dlink.del(1);
for (int i=0; i<dlink.size(); i++){
System.out.println("dlink("+i+")="+ dlink.get(i).value);
}
}
}
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java数据结构和算法学习之汉诺塔示例
- Java数据结构及算法实例:三角数字
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构之AVL树详解
- qqwry.dat的数据结构图文解释第1/2页
- JavaScript中数据结构与算法(五):经典KMP算法