`
大_圣
  • 浏览: 17652 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

链表....

 
阅读更多

数据结构中的一种常用结构.. 链表

这个怕是熟悉的不能再熟悉了,特别是用c++写过代码的选手们..

于是.今天自己实现了一些链表的操作(虽然这些操作在java里有提供方法).但是自己实现来练练手也还是不错的.

以下都是以双链表结构来实现的..

 

/**
 * 链表中的结点数据类
 * 
 * @author ds
 */
public class LinkNode {

	// 结点中的数据域
	private Object obj;
	// 结点中的指针域
	private LinkNode next;
	private LinkNode prior;

	public LinkNode(Object obj) {
		this.obj = obj;
	}

	public LinkNode getPrior() {
		return prior;
	}

	public void setPrior(LinkNode prior) {
		this.prior = prior;
	}

	public Object getObj() {
		return obj;
	}

	public void setObj(Object obj) {
		this.obj = obj;
	}

	public LinkNode getNext() {
		return next;
	}

	public void setNext(LinkNode next) {
		this.next = next;
	}

}

 

添加结点的两个方法

public void add(Object obj) {
		if (rear == null) { // 如果尾结点为空,说明链表为空,则新添加的结点就既是头结点又是尾结点
			LinkNode ln = new LinkNode(obj);
			front = ln;
			rear = ln;
		} else {// 否则接到最后
			LinkNode ln = new LinkNode(obj);
			rear.setNext(ln);
			ln.setPrior(rear);
			rear = ln;// 改变尾结点
		}
	}

public void add(int index, Object obj) {
		if (index > size() || index < 0) {
			throw new RuntimeException("输入的索引位置错误:" + index);
		} else if (index == size()) {
			add(obj);
		} else {// 索引位置正确的时候
			int i = 0;
			LinkNode ln_f = front;
			while (i < index) {
				i++;
				ln_f = ln_f.getNext();
			}
			LinkNode ln = new LinkNode(obj);
			if (i == 0) {// 加到第一个位置
				ln.setNext(ln_f);
				ln_f.setPrior(ln);
				front = ln;
			} else {
				ln.setNext(ln_f);
				ln_f.getPrior().setNext(ln);
				ln.setPrior(ln_f.getPrior());
				ln_f.setPrior(ln);
			}
		}
	}

 

清除结点的两个方法

public void removed() {
		if (rear == null) {
			System.out.println("链表中不存在结点..");
		} else if (front.equals(rear)) {// 链表中只有一个结点的时候.
			front = null;
			rear = null;
		} else {
			// 尾指针指向倒数第二个结点
			rear = rear.getPrior();
			// 丢掉最后一个结点.
			rear.setNext(null);
		}
	}

public LinkNode removed(int index) {
		if (index >= size() || index < 0) {
			throw new RuntimeException("输入的索引位置错误:" + index);
		} else {// 索引位置正确的时候
			int i = 0;
			LinkNode ln_f = front;
			while (i < index) {
				i++;
				ln_f = ln_f.getNext();
			}
			if (i == size() - 1) {// 删除的是最后一个结点的时候
				removed();
			} else if (i == 0) {// 删除的是第一个结点的时候
				front = front.getNext();
			} else {
				ln_f.getNext().setPrior(ln_f.getPrior());
				ln_f.getPrior().setNext(ln_f.getNext());
			}
			return ln_f;
		}
	}

  

得到链表的长度

	public int size() {
		// 首先长度为1
		int i = 0;
		LinkNode ln = front;
		while (ln != null) {// 当前结点的下一个结点不为空的时候.
			ln = ln.getNext();
			i++;
		}
		return i;
	}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics