Java实现单链表

        Java语言实现的单链表,只实现了基本功能。

        单链表的结点由存放数据元素的数据域和存放后继结点地址的指针域组成。java中由于不存在指针,指针域应存放后继结点的引用。

        节点类:

/**
	 * 节点类
	 * @param <T>
	 */
	public static class Node<T> {
		private T value;
		private Node<T> next;

		public Node(T value, Node<T> next) {
			this.value = value;
			this.next = next;
		}
		
		public Node(T value){
			this(value, null);
		}
	}

完整代码:

public class SingleLinkedList<T> {
	
	/**
	 * 节点类
	 * @param <T>
	 */
	public static class Node<T> {
		private T value;
		private Node<T> next;

		public Node(T value, Node<T> next) {
			this.value = value;
			this.next = next;
		}
		
		public Node(T value){
			this(value, null);
		}
	}
	
	private Node<T> head;

	public SingleLinkedList() {
		head = new Node<T>(null);
	}

	/**
	 * 单链表添加元素,使用头插法
	 * @param e 要插入的元素
	 * @return 正确插入返回true
	 */
	public boolean add(T e) {
		addFirst(e);
		return true;
	}
	
	/**
	 * 单链表头插法
	 * @param e 要插入元素
	 */
	public void addFirst(T e){
		Node<T> newNode = new Node<T>(e, null);
		if (size()==0) {
			head.next = newNode;
		} else {
			Node<T> temp = head.next;
			head.next = newNode;
			newNode.next = temp;
		}
	}
	
	/**
	 * 单链表尾插法
	 * @param e 要插入的元素
	 */
	public void addLast(T e){
		Node<T> newNode = new Node<T>(e, null);
		Node<T> temp = head;
		while(temp.next!=null){
			temp = temp.next;
		}
		temp.next = newNode;
	}

	/**
	 * 返回单链表的大小
	 * @return 单链表元素的个数
	 */
	public int size() {
		int i = 0;
		Node<T> node = head;
		while (node.next != null) {
			i++;
			node = node.next;
		}
		return i;
	}
	
	/**
	 * 得到某一位置的元素
	 * @param index 下标
	 * @return 指定下标的元素
	 */
	public T get(int index){
		if(head==null){
			return null;
		}
		if(index>size()-1||index<0){
			return null;
		}
		Node<T> temp = head.next;
		int i=0;
		while(temp!=null){
			if(index==i){
				return temp.value;
			}
			i++;
			temp = temp.next;
		}
		return null;
	}
	
	/**
	 * 在指定下标处插入元素
	 * @param e 带插入元素
	 * @param index 指定下标
	 * @return
	 */
	public boolean insert(T e, int index){
		validateindex(index);
		Node<T> newNode = new Node<T>(e, null);
		Node<T> temp = head;
		int i=0;
		while(temp!=null){
			if(index==i){
				newNode.next = temp.next;
				temp.next = newNode;
				return true;
			}
			i++;
			temp = temp.next;
		}
		return false;
	}
	
	/**
	 * 删除指定下标的元素
	 * @param index
	 * @return
	 */
	public boolean remove(int index){
		validateindex(index);
		Node<T> temp = head;
		Node<T> q;
		int i=0;
		while(temp!=null){
			if(index==i){
				q = temp.next;
				temp.next = q.next;			
			}
			i++;
			temp = temp.next;
		}
		return true;
	}

	/**
	 * 判断下标是否在正常范围内
	 * @param index 下标
	 * @return 在0~size-1之间为正常,返回true,否则false
	 */
	private boolean validateindex(int index) {
		if(index<0||index>=size()){
			throw new RuntimeException("下标越界: "+index);
		}else{
			return true;
		}
	}
	
	@Override
	public String toString() {
		String str = "[ ";
		for (int i=0;i<size();i++) {
			str = str + get(i) + " ";
		}
		str = str + "]";
		return str;
	}	
}

测试如下:

public static void main(String[] args) {
		//头插法
		SingleLinkedList<String> list = new SingleLinkedList<String>();
		list.add("1");
		list.add("2");
		list.add("3");
		list.add("4");
		System.out.println(list.toString());
		list.insert("X", 2);
		System.out.println(list.toString());
		list.remove(2);
		System.out.println(list.toString());
	}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值