手工实现linkedList底层功能

链表:区别于数组,有头节点和尾节点,和数据部分组成,查询男,增删快链表的功能逻辑

package 手工实现;

public class Node2 {
	int hash;
	Object key;
	Object value;
	Node2 next;
}

package 手工实现;

import javax.management.RuntimeErrorException;

public class TestLinekedList {
	private Node1 first;
	private Node1 last;
	private int size;

//	[a,b,c]
	public void add(Object obj) {
		Node1 node = new Node1(obj);
		if (first == null) {
//	链表为空时。第一次放,参数节点没有前后节点,首尾节点自然变成参数节点
			node.previous = null;
			node.next = null;

			first = node;
			last = node;
		} else {
//	其余情况,从链表的最后开始放,参数的前节点为尾节点,后节点为空
//			头节点还是头节点,尾节点变成了参数节点
			node.previous = last;
			node.next = null;

			last.next = node;
			last = node;
		}
		size++;
	}
	
//	插入方法
//	[a,b,c]--->[a,b,d,c]
	public void add(int index,Object obj) {
//		分情况判断,首位节点时候,
		Node1 temp=getNode(index);
		Node1 newNode=new Node1(obj);
		if (temp!=null) {
//			Node up=temp.previous;
//			
//			up.next=newNode;
//			newNode.previous=up;
//			
//			newNode.next=temp;
//			temp.previous=newNode;
//			同理,不过绕弯子
			if (temp.equals(first)) {	//失效了
				temp.previous=newNode;
				newNode.next=temp;
				
				
//				newNode.previous=null;
				size++;
				return;
			}if (temp.equals(last)) {
				temp.next=newNode;
				newNode.previous=temp;
				
				newNode.next=null;
				
				size++;
				return;
				
			}else {
				temp.previous.next=newNode;
				newNode.previous=temp.previous;
				
				newNode.next=temp;
				temp.previous=newNode;
				size++;
				return;
			}
		}
	}
	
//	删除的方法
	public void remove(int index) {
		check(index);
		Node1 temp=getNode(index);
		
		if (temp==first) {
			first=first.next;
		}else if (temp==last) {//失效了
			last=temp.previous;
			last.next=null;		//成功了
		} else {
			temp.previous.next=temp.next;
			temp.next.previous=temp.previous;
		}
		size--;
	}
	
//	[a,b,c]
	public Object get(int index) {
//		从first开始找,index多少,就next多少次
//		二次优化
		this.check(index);
		Node1 node=getNode(index);
		
		return node!=null?node.element:null;
	}

	public void set(int index, Object obj) {
		Node1 node=getNode(index);
		node.element=obj;
	}
	
	public Node1 getNode(int index) {
//		通过索引获取节点
		Node1 temp = null;
		if (index < size >> 1) {
			temp = first;
			for (int i = 0; i < index; i++) {
				temp = temp.next;
			}
		} 
		if(index>size>>1){
			temp = last;
			for (int i = size-1; i >index; i--) {
				temp=temp.previous;
			}
		}
		return temp;
	}
	
//	检测索引合法性
	public void check(int index) {
		if (index>size-1||index<0) {
			throw new RuntimeException("索引不合法"+index);
		}
	}
	
	public String toString() {
//	因为没了elementdate,所以打印方法变了
		StringBuilder sb = new StringBuilder();
		sb.append('[');
//	从首节点开始,没append一个数据次,指向下一个节点
		Node1 temp = first;
		while (temp != null) {
			sb.append(temp.element + ",");
			temp = temp.next;
		}
		sb.setCharAt(sb.length() - 1, ']');
		return sb.toString();
	}

	public static void main(String[] args) {
		TestLinekedList t1 = new TestLinekedList();
		for (int i = 0; i < 10; i++) {
			t1.add("mao" + i);
		}
		System.out.println(t1.get(0));
//		t1.set(2, 66);
		t1.add(0, 11);
//		t1.remove(0);
		System.out.println(t1);
		System.out.println(t1.size);
	}
}

有点繁琐,但算是干货,大家可以观看测试,有小问题,以后完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值