Java之线性链表

170 阅读1分钟

链表的Node节点类

public class LinkedList<E> {
	/**
	 * 结点
	 * @param <E>
	 */
	private static class Node<E> {
		E item;
		Node<E> next;
		Node<E> prev;
		Node(Node<E> prev, E element, Node<E> next) {
			this.item = element;
			this.next = next;
			this.prev = prev;
		}
	}
	Node<E> first;//头节点
	Node<E> last;//尾节点
	int size;//大小
	public LinkedList() {
	}
	/**
	 * 在最后添加
	 * @param e
	 */
	public void add (E e) {
		linkLast(e);
	}
	/**
	 * 在最后添加
	 * @param e
	 */
	private void linkLast(E e) {
		Node<E> newNode = new Node<E>(last, e, null);
		Node<E> l = last;
		last = newNode;
		if (l == null) {
			first = newNode;
		}else {
			l.next = newNode;
		}
		size ++;
	}
	/**
	 * 获取第index位置上的节点的值域
	 * @param index
	 * @return
	 */
	public E get(int index) {
		if(index < 0 || index >size) {
			return null;
		}
		return node(index).item;
	}
	/**
	 * 获取第index位置上的节点
	 * @param index
	 * @return
	 */
	private Node<E> node(int index) {
		//index在前半部份 ����벿��
		if (index < (size>>1)) {
			Node<E> node = first;
			for(int i = 0; i < index; i++) {
				node = node.next;
			}
			return node;
		} else { //index在后半部份 �벿��
			Node<E> node = last;
			for(int i = size - 1; i > index; i--) {
				node = node.prev;
			}
			return node;
		}
	}
	/**
	 * �在index的位置上添加一个元素
	 * @param index
	 * @param e
	 */
	public void add (int index, E e) {
		if(index < 0 || index >size) {
    		return;
    	}
		if (index == size) {
			linkLast(e);
		} else {
			Node<E> target = node(index);
			Node<E> pre = target.prev;
			Node<E> newNode = new Node<E>(pre, e, target);
//			pre.next = newNode;
//			pre = newNode;
			//要考虑index=0时的情况
			if(pre == null) {
				first = newNode;
			} else {
				pre.next = newNode;
			}
			pre = newNode;
			size++;
		}
	}
    /**
     * @param index
     */
    public void remove(int index){
    	Node<E> target = node(index);
    	unlinkNode(target);
    }
    private void unlinkNode(Node<E> p) {
    	//�п�
//    	p.prev.next = p.next;
//    	p.next.prev = p.prev;
    	Node<E> pre = p.prev;
    	Node<E> next = p.next;
    	if (pre == null) {
			first = p.next;//删除头节点
		} else {
			pre.next = p.next;
		}

    	if (next == null) {
			last = p.prev;//删除尾结节
		} else {
			next.prev = p.prev;
		}
    	size--;
    }

}

测试类

    @Test
    public void addition_isCorrect() throws Exception {
        LinkedList<Integer> linkedList = new LinkedList<>();
        linkedList.add(0, 4);
        linkedList.add(1);
        linkedList.add(6);
        linkedList.add(0,8);
        linkedList.remove(4);
        for(int i = 0; i < linkedList.size; i++) {
            System.out.print( i + ":" + linkedList.get(i) + "  ");
        }
    }
public class Test {
    @org.junit.Test
    public void testRadixSort(){
        LinkedList<Mahjong> list=new LinkedList<Mahjong>();
        list.add(new Mahjong(3,1));
        list.add(new Mahjong(2,3));
        list.add(new Mahjong(3,7));
        list.add(new Mahjong(1,1));
        list.add(new Mahjong(3,8));
        list.add(new Mahjong(2,2));
        list.add(new Mahjong(3,2));
        list.add(new Mahjong(1,3));
        list.add(new Mahjong(3,9));
        System.out.println(list);
        radixSort(list);
        System.out.println(list);
    }

    public static void radixSort(LinkedList<Mahjong> list){
        //先对点数进行分组
        LinkedList[] rankList=new LinkedList[9];
        for (int i=0;i<rankList.length;i++){
            rankList[i]=new LinkedList();
        }
        //把数据一个一个的放入到对应的组中
        while(list.size()>0){
            //取一个
            Mahjong m=list.remove();
            //放到组中
            rankList[m.rank-1].add(m);
        }
        //把9个组合到一起
        for (int i = 0; i < rankList.length; i++) {
            list.addAll(rankList[i]);
        }

        //先花色数进行分组
        LinkedList[] suitList=new LinkedList[3];
        for (int i=0;i<suitList.length;i++){
            suitList[i]=new LinkedList();
        }
        //把数据一个一个的放入到对应的组中
        while(list.size()>0){
            //取一个
            Mahjong m=list.remove();
            //放到组中
            suitList[m.suit-1].add(m);
        }
        //把3个组合到一起
        for (int i = 0; i < suitList.length; i++) {
            list.addAll(suitList[i]);
        }

    }
}
public class Mahjong {
    public int suit;//筒,万,索
    public int rank;//点数 一  二  三

    public Mahjong(int suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    @Override
    public String toString() {
        return "("+this.suit+" "+this.rank+")";
    }
}