尚学堂·Java300集·容器·LinkedList类·自实现MyLinkedList

eclipse运行结果截图:
在这里插入图片描述
源码:

/**
 * 自己编写的一个LinkedList容器的实现类MyLinkedList
 * 功能:依次递增节点、删除某个节点、修改替换某个节点、插入某个节点、获取某个节点等主要功能
 * @author 绝尘
 *
 */
public class MyLinkedList {
	
	//这是一个容器的类:LinkedList链表自实现
	//容器里面装节点Node,Node也是类
	//第一个节点、最后一个节点
	Node firstNode;
	Node lastNode;
	int size;
	
	public void checkRange(int index) {
		Node node = firstNode;
		int i=0;
		while(node!=null)
		{
			node = node.next;
			i++;
		}
		if(index < 0 || index > i-1)
			throw new RuntimeException("索引超出容器范围:"+index);
	}
	
	//get(int index)
	public Node get(int index) {
		
		checkRange(index);//检查索引index是否合法,非法则抛出异常
		
		return getIndexNode(index);
	}
	
	//set(int index,Object obj)
	public void set(int index,Object obj) {
		checkRange(index);//检查索引index是否合法,非法则抛出异常
		Node newNode = new Node();
		newNode.element = obj;
		Node indexNode = getIndexNode(index);
		if(index == 0 && size == 0)
		{
			addNode(obj);
		}
		if(index == 0 && size == 1)
		{
			firstNode = newNode;
		}
		if(index == 0 && size > 1)
		{
			newNode.next = firstNode.next;
			firstNode.next.previous = newNode;
			firstNode = newNode;
		}
		if(index == size-1 && size == 1)
		{
			lastNode = newNode;
		}
		if(index == size-1 && size > 1)
		{
			newNode.previous = lastNode.previous;
			lastNode.previous.next = newNode;
			lastNode = newNode;
		}
		if(index > 0 && index < size-1)
		{
			newNode.previous = indexNode.previous;
			newNode.next = indexNode.next;
			indexNode.previous.next = newNode;
			indexNode.next.previous = newNode;
		}
	}
	
	public void removeIndexNode(int index) {
		checkRange(index);//检查索引index是否合法,非法则抛出异常
		Node temp = getIndexNode(index);
		Node up = temp.previous;
		Node down = temp.next;
		if(up == null && down == null) {
			firstNode = null;
		}
		if(up == null && down != null) {
			down.previous = null;
			firstNode = down;
		}
		if(up != null && down == null) {
			up.next = null;
			lastNode = up;
		}
		if(up != null && down != null) {
			up.next = down;
			down.previous = up;
		}
		size--;
	}
	
	public void insertIndexNode(int index,Object obj) {
		checkRange(index);//检查索引index是否合法,非法则抛出异常
		Node node = new Node();
		node.element = obj;//欲插入的节点node
		Node temp = getIndexNode(index);
		//bb cc dd ee
		if(index == 0) {
			node.next = firstNode;
			firstNode.previous = node;
			firstNode = node;
		}
		if(index > 0 && index <= size-1) {
			node.previous = temp.previous;
			node.next = temp;
			temp.previous.next = node;
			temp.previous = node;
		}
		size++;
	}
	
	public Node getIndexNode(int index) {
		Node node = firstNode;
		int i = 0;
		while (true) {
			if(i==index)
				return node;
			i++;
			node = node.next;
		}
	}
	
	public void addNode(Object obj) {
		Node newNode = new Node();//新建一个节点newNode
		newNode.element = obj;//节点newNode的元素放obj
							  //一个新节点创建好,准备加入list1
		//放第一个
		if(firstNode == null){
			firstNode = newNode;
			lastNode = firstNode;//最后一个节点  也是第一个节点
			this.size++;
		}
		//放第二个 第三个...
		else {
			newNode.previous = lastNode;
			lastNode.next = newNode;
			lastNode = newNode;
			this.size++;
		}
		
	}
	
	public String toString() {
		if(size == 0) return null;
		Node temp = new Node();
		StringBuilder sb = new StringBuilder("[");
		temp = firstNode;
		while(temp != null) {
			//System.out.println(temp.element);
			sb.append(temp.element+",");
			temp = temp.next;
		}
		sb.setCharAt(sb.length()-1,']');
		return sb.toString();
	}
	
	public static void main(String[] args) {
		
		MyLinkedList list1 = new MyLinkedList();
		
		list1.addNode("aa");//依次增加节点
		list1.addNode("bb");
		list1.addNode("cc");
		list1.addNode("dd");
		list1.addNode("ee");
		System.out.println(list1);//打印对象:要得到对象的内容的话,需要重写toString
								  //否则打印的就是对象的引用地址如:MyLinkedList@15db9742
		
		System.out.println(list1.get(2).element);//获取索引为2处的节点.element
		
		list1.removeIndexNode(0);//移除list1对象自身索引为0的节点
		System.out.println(list1);
		System.out.println(list1.size);
		
		list1.insertIndexNode(2,"c1c1");//在索引为2处插入element值为"c1c1"的节点
		System.out.println(list1);
		System.out.println(list1.size);
		
		list1.set(2,"c2c2");//索引为2处  修改为element值为"c2c2"的节点
		System.out.println(list1);
		System.out.println(list1.size);
		
	}
	
}

class Node {//节点类
	//一个Node 有自身、上一Node、下一Node
	Object element;
	Node next;
	Node previous;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值