数据结构(4)--双链表
来源:互联网 发布:sql server union 编辑:程序博客网 时间:2024/05/23 21:02
双向循环链表:每个结点包含了数据、直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环。可以形象的理解成一群孩子手拉手牵成一个圆圈,从头一个孩子开始可以从左往右报数,也可以从右往左开始报数。优点:双向循环链表可以迅速的获取当前数据的前驱数据,解决了单向循环链表从头开始遍历的麻烦
结点类:
/** * 结点: 左指针+数据+右指针 */ public class DoubleNode<T> { private DoubleNode<T> left,right; private T data; DoubleNode(T data) { this(data,null,null); } DoubleNode() { this(null,null,null); } DoubleNode(T data,DoubleNode<T> left,DoubleNode<T> right) { this.data = data; this.left = left; this.right = right; } public T getData() { return this.data; } public DoubleNode<T> getLeft() { return this.left; } public DoubleNode<T> getRight() { return this.right; } public void setData(T data) { this.data = data; } public void setRight(DoubleNode<T> right) { this.right = right; } public void setLeft(DoubleNode<T> left) { this.left = left; } public String toString() { return getData().toString(); }}
实现类
public class DoubleLinkList<T> { public DoubleNode<T> head; //建空表,带头结点 DoubleLinkList() { this(null); } //具有头结点 public DoubleLinkList(T element) { // TODO Auto-generated constructor stub if(element==null){ head=new DoubleNode<T>(element,null,null); head.setRight(head); head.setLeft(head); }else { //单个数据结点的状况 DoubleNode<T> headRight = new DoubleNode<T>(element,null,null); head = new DoubleNode<T>(null,headRight,headRight); headRight.setLeft(head); headRight.setRight(head); } } //表长 /* * 思路: * 1. 用temp记住对象 * 2. 遍历,假如temp不等于最后一个元素,还会遍历下去 * 3. 循环增加长度 */ public int Length() { int len = 0; DoubleNode<T> temp = head; while(temp.getRight() != head) { len++; temp = temp.getRight(); } return len; } //取下标index处的数据 /** * 思路: * 1. 假如在0的方位,则是获取第一个,利用hean.getRight * 2. 假如是len,则是获取最后一个,利用head.getleft * 3. 假如在中间就通过遍历,获取元素 * @param index * @return */ public T getElement(int index) { if(index <= 0) { return head.getRight().getData(); } int len = Length(); if(index >= len) { return head.getLeft().getData(); } T element = null; if(index > 0 && index < len) { int k = 0; DoubleNode<T> temp = head; //此处只能用while不能用if,用错好几次 while(k <= index && temp.getRight() != head) { k++; temp = temp.getRight(); } element = temp.getData(); } return element; } //尾添 /** * 思路: * 1. 定义最后一个的Node,左边为head.getLeft(最后一个),右边为head * 2. 然后设置左右一个的右边为node,head的左边为Node * * @param element * @return */ public boolean add(T element) { if(element == null) return false; DoubleNode<T> node = new DoubleNode<T>(element,head.getLeft(),head); head.getLeft().setRight(node); head.setLeft(node); return true; } //首添 public boolean addHead(T element) { if(element == null) return false; DoubleNode<T> node = new DoubleNode<T>(element,head,head.getRight()); head.getRight().setLeft(node); head.setRight(node); return false; } //表index处,添加新数据element public boolean addByIndex(int index, T element) { if(index <= 0) { return addHead(element); }else if(index >= Length()) { return add(element); }else { int k = 0; DoubleNode<T> temp = head; //此处只能用while不能用if,用错好几次 while(k <= index && temp.getRight() != head) { k++; temp = temp.getRight(); } DoubleNode<T> node = new DoubleNode<T>(element,temp.getLeft(),temp); temp.getLeft().setRight(node); temp.setLeft(node); } return true; } }
0 0
- 数据结构(4)--双链表
- 数据结构-双链表
- [数据结构]双链表
- 数据结构-双链表
- 数据结构-双链表
- 数据结构4
- 数据结构-4
- 数据结构4
- 数据结构基础4_双链表的实现
- 数据结构学习之双链表
- 数据结构实现循环双链表
- 数据结构-双链表
- 数据结构之双链表
- 数据结构--循环双链表
- 数据结构之双链表
- 数据结构c++实现----双链表
- 【数据结构】双链表的演示
- 数据结构之双链表
- div 初始高度,并随内容高度变化
- eclipse下成功启动tomcat却还是显示404的原因
- jQuery判断Dom对象是否存在
- position:absolute 的深入探讨
- 浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘
- 数据结构(4)--双链表
- CSS position: absolute、relative定位问题不详解
- return false
- CSS样式表继承小结
- 扩展
- CSS文本超出2行就隐藏并且显示省略号
- div里面的内容超出自身高度时,显示省略号
- CSS颜色渐变
- CSS3 box-sizing属性