链表的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+")";
}
}