手写LinkedList, 增加小封装,增加泛型约束(5)

package com.jianshun;

public class Node {

	Node previous; //上一个节点
	Node next;  //下一个节点
	Object element;  //元素数据
	public Node(Node previous, Node next, Object element) {
		super();
		this.previous = previous;
		this.next = next;
		this.element = element;
	}
	public Node(Object element) {
		super();
		this.element = element;
	}
}
package com.jianshun;
/**
 * 自定义一个链表
 * 增加小的封装,增加泛型
 * @author Administrator
 *
 */
public class SxtLinkedList05<E> {

	private Node first;
	private Node last;
	
	private int size;
	
	public void add(int index,E element){
		checkRange(index);
		Node newNode = new Node(element);
		Node temp = getNode(index);

		if(temp!=null){
			Node up = temp.previous;
			if(up == null){//把元素插入到位首
				first = newNode;
				newNode.next = temp;
				temp.previous = newNode;
			}else if(size == index){//将元素插入到末尾
				//待续
			}else{
				up.next = newNode;
				newNode.previous = up;
				newNode.next = temp;
				temp.previous = newNode;
			}
		}
		size++;
	}
	
	//[]
	//['a','b','c']
	public void add(E element){
		Node node = new Node(element);
		
		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++;
	}			
	
	//根据下标删除数据
	public void remove(int index){
		checkRange(index);
		Node temp = getNode(index);
		 
		if(temp != null){
			Node up = temp.previous;
			Node down = temp.next;
			
			//被删除的元素是第一个时
			if(index == 0){
				first = down;
			}
			
			//被删除的元素是最后一个时候
			if(index == size-1){
				last = up;
			}
			
			if(up!=null){
				up.next = down;
			}
			if(down!=null){
				down.previous = up;
			}
			size--;
		}
	}
	
	//根据下标获取节点(代码重用)
	private Node getNode(int index){
		checkRange(index);
		Node temp = null;
		if(index <= (size>>1)){ //size >>1 相当于除以2
			temp = first;
			for(int i=0; i<index; i++){
				temp = temp.next;
			}
		}else{
			temp = last;
			for(int i=size-1; i>index; i--){
				temp = temp.previous;
			}
		}
		return temp;
	}
	
	
	//[]
	//[a,b,c,d,e,f]  c-2
	public E get(int index){
		checkRange(index);
		Node temp = getNode(index);
		return (E) (temp !=null ? temp.element : null);
	}		
	
	//分装对索引的调用
	public void checkRange(int index){
		if(index <0 || index >size - 1){
			throw new RuntimeException("索引數字不合法:"+index);
		}
	}
	
		
	@Override
	public String toString() {
		//[a,b,c] first=a, last=c
		StringBuilder sb = new StringBuilder("[");
		Node 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) {
		SxtLinkedList05<String> list = new SxtLinkedList05<String>();
		
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		list.add("e");
		list.add("f");
		
		//list.remove(5);
		//list.add(3,"老高");
		//list.add(0,"老陈");
		list.add(5,"凡凡");
		System.out.println(list);
		System.out.println(list.get(1));
	}	
		
		
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值