基于利用指针对线性表的实现(单链表)
2017-02-03 16:24
363 查看
链表是由一系列表的结点的对象组成。因为结点是一个独立的对象,因此能够实现独立的节点类。
每个节点只有一个指向表中的下一个节点的指针,因此实现的线性表为单链表,
实现的单链表具有表头结点。表头结点是表的第一个结点,他与表中其他元素一样,只是他的值被忽略,不被看作表中的实际元素。添加表头结点的目的是使当前指针current指向当前元素的前驱结点,使得插入等操作变得简易,降低源代码的复杂性。(注:当当前指针current指向当前结点时,向当前位置插入新对象时,需要从头结点依次向后寻找,知道找到当前元素的前驱结点后,才能进行添加。并且需要考虑链表中无节点与只有一个结点的特殊情况。)
/*链表:利用指针实现*/
public class LinkList implements List{
private Link head; //指向表的头结点
private Link tail; //指向表的尾节点
protected Link current; //保存当前节点
LinkList(int size){ //构造方法-忽略大小
setup();
}
LinkList(){ //无参构造方法
setup();
}
private void setup(){ //初始化操作
tail = head = current = new Link(null); //创造头结点
}
public void clear(){ //从列表中移除所有的对象
head.setNext(null); //终止访问其他节点
current= tail = head; //重新初始化
}
//在当前位置插入对象
public void insert(Object item){
assert (current != null) : "无当前元素";
current.setNext(new Link(item, current.next()));
if(tail == current){
tail = current.next();
}
}
//从链表尾部添加对象
public void append(Object item){
tail.setNext(new Link(item, null));
tail = tail.next();
}
//移除并返回当前对象
public Object remove(){
if(!isInList()){
return null;
}else{
Object item = current.next().element(); //得到当前对象的值
if(tail == current.next()){ //设置尾结点
tail = current;
}
current.setNext(current.next().next()); //从链表中中移除对象
return item; //返回移除的值
}
}
//移除所有对象
public void removeAll(){
head.setNext(null); //终止访问其他节点
current= tail = head; //重新初始化
}
//设置当前位置为第一个位置
public void setFirst(){
current = head;
}
//移动当前位置至下一位置
public void next(){
if(current != null){
current = current.next();
}
}
//移动当前位置至上一位置
public void previous(){
if((current == null) || (current == head)){ //上一位置无对象
current = null;
return;
}
Link temp = head;
while((temp != null) && (temp.next() != current)){ //从头结点开始检索
temp.next();
}
current = temp;
}
//返回链表的长度
public int length(){
int cnt = 0;
for(Link temp = head.next(); temp != null; temp = temp.next()){
cnt++;
}
return cnt;
}
//设置当前位置至指定位置
public void setPosition(int pos){
current = head;
for(int i=0; (current != null) && (i < pos); i++){
current = current.next();
}
}
//设置当前对象的值
public void setValue(Object item){
assert isInList() : "链表内无该对象";
current.next().setElement(item);
}
//获得当前对象的值
public Object currentValue(){
if(!isInList()){
return null;
}
return current.next().element();
}
//是否为空链表
public boolean isEmpty(){
return head.next() == null;
}
//是否在列表中
public boolean isInList(){
return (current != null) && (current.next() != null);
}
//打印链表
public void print(){
if(isEmpty()){
System.out.println("()");
}else{
System.out.print("(");
for(setFirst(); isInList(); next()){
System.out.print(currentValue()+" ");
}
System.out.println(")");
}
}
}//class LinkList
/*一个链表的节点*/ public class Link { private Object element; //该节点的对象 private Link next; //指向链表的下一个节点 Link(Object item, Link nextvalue){ //构造方法1 element = item; next = nextvalue; } Link(Link nextvalue){ //构造方法2 next = nextvalue; } Link next(){ //获得下一个节点 return next; } Link setNext(Link nextvalue){ //设置下一个节点,成功后返回下一个节点 return next = nextvalue; } Object element(){ //获得该节点的对象 return element; } Object setElement(Object item){ //设置该节点的对象,成功后返回该对象 return element = item; } }//class Link
每个节点只有一个指向表中的下一个节点的指针,因此实现的线性表为单链表,
实现的单链表具有表头结点。表头结点是表的第一个结点,他与表中其他元素一样,只是他的值被忽略,不被看作表中的实际元素。添加表头结点的目的是使当前指针current指向当前元素的前驱结点,使得插入等操作变得简易,降低源代码的复杂性。(注:当当前指针current指向当前结点时,向当前位置插入新对象时,需要从头结点依次向后寻找,知道找到当前元素的前驱结点后,才能进行添加。并且需要考虑链表中无节点与只有一个结点的特殊情况。)
/*链表:利用指针实现*/
public class LinkList implements List{
private Link head; //指向表的头结点
private Link tail; //指向表的尾节点
protected Link current; //保存当前节点
LinkList(int size){ //构造方法-忽略大小
setup();
}
LinkList(){ //无参构造方法
setup();
}
private void setup(){ //初始化操作
tail = head = current = new Link(null); //创造头结点
}
public void clear(){ //从列表中移除所有的对象
head.setNext(null); //终止访问其他节点
current= tail = head; //重新初始化
}
//在当前位置插入对象
public void insert(Object item){
assert (current != null) : "无当前元素";
current.setNext(new Link(item, current.next()));
if(tail == current){
tail = current.next();
}
}
//从链表尾部添加对象
public void append(Object item){
tail.setNext(new Link(item, null));
tail = tail.next();
}
//移除并返回当前对象
public Object remove(){
if(!isInList()){
return null;
}else{
Object item = current.next().element(); //得到当前对象的值
if(tail == current.next()){ //设置尾结点
tail = current;
}
current.setNext(current.next().next()); //从链表中中移除对象
return item; //返回移除的值
}
}
//移除所有对象
public void removeAll(){
head.setNext(null); //终止访问其他节点
current= tail = head; //重新初始化
}
//设置当前位置为第一个位置
public void setFirst(){
current = head;
}
//移动当前位置至下一位置
public void next(){
if(current != null){
current = current.next();
}
}
//移动当前位置至上一位置
public void previous(){
if((current == null) || (current == head)){ //上一位置无对象
current = null;
return;
}
Link temp = head;
while((temp != null) && (temp.next() != current)){ //从头结点开始检索
temp.next();
}
current = temp;
}
//返回链表的长度
public int length(){
int cnt = 0;
for(Link temp = head.next(); temp != null; temp = temp.next()){
cnt++;
}
return cnt;
}
//设置当前位置至指定位置
public void setPosition(int pos){
current = head;
for(int i=0; (current != null) && (i < pos); i++){
current = current.next();
}
}
//设置当前对象的值
public void setValue(Object item){
assert isInList() : "链表内无该对象";
current.next().setElement(item);
}
//获得当前对象的值
public Object currentValue(){
if(!isInList()){
return null;
}
return current.next().element();
}
//是否为空链表
public boolean isEmpty(){
return head.next() == null;
}
//是否在列表中
public boolean isInList(){
return (current != null) && (current.next() != null);
}
//打印链表
public void print(){
if(isEmpty()){
System.out.println("()");
}else{
System.out.print("(");
for(setFirst(); isInList(); next()){
System.out.print(currentValue()+" ");
}
System.out.println(")");
}
}
}//class LinkList
相关文章推荐
- HttpClient 4.3连接池参数配置及源码解读
- spark--PageRank
- android 把文件插入到系统图库
- mysql 免安装版配置
- localtime 和 localtime_r
- linux下查看cpu、内存和硬盘大小
- 在centos下搭建lamp环境
- 剑指Offer系列-面试题9:斐波那契数列
- javascript基础--对象(Object)封装
- Swift3.0-反向传值
- Unity3D入门篇——Transform类
- TypeScript和Knockout.js的结合使用
- 树的重量 洛谷1268 树+思考题
- 在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案
- linux服务器ssh防爆破
- 编译与配置
- Dynamic programming 4
- deepinlinux + n卡
- 圆形图片CircleImageView开源库使用
- web.xml的配置详解