* 数据结构,环状结构
1.Node<T>类
public class Node<T> {
public T data;
public Node<T> next;
}
2.Ring<T>类
public class Ring<T> {
private Node<T> head;
private Node<T> tail;
public void add(T value){
Node<T> node=new Node<T>();
node.data=value;
node.next=null;
if(head==null){//如果头为空,头==当前加入的节点,也等于尾
head=tail=node;
tail.next=head;
}
else{
node.next=tail.next;//确保当前加入的节点为尾节点
tail.next=node;
tail=node;
}
}
public void extract(int distance){
extract(tail,distance);
}
//提取数据,从尾部开始提取尾部的next,并迭代
private void extract(Node<T> t,int distance){
if(t.next==t){
System.out.println(t.data);
return;
}else{
Node<T> n=t.next;//首先输出第一个节点,也就是尾节的next节点
System.out.println(n.data);
t.next=n.next;//尾节点的next为当前输出节点的下一个节点
for(int i=0;i<distance;i++){
t=t.next;//尾节点向后移动distance个位置迭代
}
extract(t,distance);
}
}
public void show(){
Node<T> h=head;
while(1==1){
System.out.println(h.data);
h=h.next;
}
}
}
3.Test类
public abstract class test {
/**
* @param args
*/
private final static int DISTANCE=3;
private final static int COUNT=7;
public static void main(String[] args) {
Ring<String> r=new Ring<String>();
r.add("张三");
r.add("李四");
r.add("王五");
r.add("张六");
r.add("钱七");
r.add("刘二麻子");
r.add("周大");
r.extract(DISTANCE);
}
}
* 链表,队列加入的元素加在最后,用迭代器遍历
import java.util.Iterator;
public class LinkTable<T> implements Iterator<T>,Iterable<T> {
private class Node<E>{
public E entity;
public Node<E> next;
}
private Node<T> head;
private Node<T> tail;
private Node<T> current;
public void add(T entity){
Node<T> node=new Node<T>();
node.entity=entity;
node.next=null;
if(head==null){
head=node;
tail=node;
}
else{
tail.next=node;
tail=node;
}
}
@Override
public boolean hasNext() {
return current!=null;
}
@Override
public T next() {
Node<T> node=current;
current=current.next;
return node.entity;
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
@Override
public Iterator<T> iterator() {
current=head;
return this;
}
}
*stack加在最后,只能从后面出栈
public class Stack<T> {
private class Node<E>{
public E entity;
public Node<E> next;
}
private Node<T> head;
public void push(T entity){
Node<T> node=new Node<T>();
node.entity=entity;
node.next=null;
if(head==null){
head=node;
}else{
node.next=head;//新加入的node在最后
head=node;
}
}
public T pop(){
Node<T> node=head;
head=head.next;
return node.entity;
}
public boolean empty(){
return head==null;
}
}
*queue 加在后面,从前面出
public class Queue<T> {
private class Node<E>{
public E entity;
public Node<E> next;
}
private int count=0;
private Node<T> head;
private Node<T> tail;
public void queue(T entity){
Node<T> node=new Node<T>();
node.entity=entity;
node.next=null;
if(head==null){
head=tail=node;
}else{
tail.next=node;
tail=tail.next;
}
count++;
}
public T deQueue(){
Node<T> n=head;
head=head.next;
count--;
return n.entity;
}
public boolean empty(){
return head==null;
}
public int size(){
return count;
}
}