您的位置:首页 > 其它

基于利用指针对线性表的实现(单链表)

2017-02-03 16:24 363 查看
    链表是由一系列表的结点的对象组成。因为结点是一个独立的对象,因此能够实现独立的节点类。
/*一个链表的节点*/
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: