线性表——链表

public class LNode<T> {
	T data;
	LNode<T> pre;
	LNode<T> next;
	
	public LNode() {
		this.data = null;
		this.next = null;
		this.pre = null;
	}
	public LNode(T data, LNode<T> pre, LNode<T> next) {
		this.data = data;
		this.pre = pre;
		this.next = next;
	}
	

}



import java.util.Iterator;

public class LinkList<T> {
	
	int length; //计算链表长度
	private LNode<T> header; 
	private LNode<T> tail;
	/**
	 * 构造有头尾结点的双向链表,链表长度为0
	 */
	public LinkList() {
		header = new LNode<T>();
		tail = new LNode<T>();
		header.next = tail;
		tail.pre = header;
		length = 0;
	}
	/**
	 * 获得pre结点
	 */
	public LNode<T> getPreNode(LNode<T> node) {
		return node.pre;
	}
	/**
	 * 获得next结点
	 */
	public LNode<T> getNextNode(LNode<T> node) {
		return node.next;
	}

	/**
	 * 传入数据,将该数据生成结点添加到链表尾部
	 * @param data
	 * @param pre
	 * @param next
	 */
	public void addNodeInLast(T data) {
		LNode<T> node = new LNode<T>(data, null, null);
		tail.pre.next = node;
		node.next = tail;
		node.pre = tail.pre;
		tail.pre = node;
		this.length++;
	}
	/**
	 * 传入值,获得与该值相等的结点
	 */
	public LNode<T> getNodeByValue(T data) {
		LNode<T> temp = header.next;
		while(temp.next!=null) {
			if(temp.data.equals(data)) {
				return temp;
			}
			temp = temp.next;
		}
		return null;
	}
	/**
	 * 传入索引,获得索引的结点
	 */
	public LNode<T> getNodeByIndex(int index) {
		if(index>this.length) {
			System.out.println("该索引大于链表长度!");
			return null;
		}
		LNode<T> temp = header.next;
		for(int i=0; i<index; i++) {
			temp = temp.next;
		}
		return temp;
	}	
	
	/**
	 * 传入值,删除与该值相等的结点
	 */
	public boolean removeNodeByValue(T value) {
		if(this.length==0) {
			System.out.println("链表为空,无法删除!");
			return false;
		}
		LNode<T> node = this.getNodeByValue(value);
		LNode<T> pre = node.pre;
		LNode<T> next = node.next;
		pre.next = next;
		next.pre = pre;
		node.pre = node.next = null;
		node.data = null;
		this.length--;
		System.gc();
		return true;
	}
	/**
	 * 出入索引,删除该位置的结点
	 * @param args
	 */
	public boolean removeNodeByIndex(int index) {
		if(index<0 || index>this.length) {
			System.out.println("索引越界!");
			return false;
		}
		LNode<T> theNode = this.getNodeByIndex(index);
		theNode.next.pre = theNode.pre;
		theNode.pre.next = theNode.next;
		theNode.next = theNode.pre = null;
		theNode.data = null;
		System.gc();
		return true;
	}
	/**
	 * 清空链表
	 * @param args
	 */
	public boolean clearList() {
		LNode<T> theNode = header.next;
		for(int i=0; i<this.length && theNode!=null; i++) {
			theNode.pre = theNode.next = null;
			theNode.data = null;
			theNode = theNode.next;
		}
		this.length=0;
		System.gc();
		return true;
	}
	
	public static void main(String[] args) {
		LinkList<Integer> ll = new LinkList<Integer>();
		for(int i=1; i<10; i++)
			ll.addNodeInLast(i);
		//ll.clearList();
		LNode<Integer> temp = ll.header.next;
		while(temp.next != null) {
			System.out.println(temp.data);
			temp=temp.next;
		}
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值