public class Node<T>{
public T data;
public Node<T> next;
public Node(T data,Node<T> next){
this.data=data;
this.next=next;}
public Node(){this(null,null);}
public String toString(){return this.data.toString();}}
单链表
public class SinglyList<T> extends Object{
public Node<T> head;
public SinglyList(){
this.head=new Node<T>();}
public SinglyList(T[] values){this();
Node<T> rear=this.head;for(int i=0;i<values.length;i++){
rear.next=new Node<T>(values[i],null);
rear=rear.next;}}
public boolean isEmpty(){return this.head.next==null;}
public T get(int i){
Node<T> p=this.head.next;for(int j=0;p!=null&&j<i;j++)
p=p.next;return(i>=0&&p!=null)?p.data:null;}
public voidset(int i,T x){if(x==null)
throw new NullPointerException("x==null");
Node<T> p=this.head.next;for(int j=0; p!=null && j<i; j++)
p = p.next;if(i>=0&& p!=null)
p.data = x;else throw new IndexOutOfBoundsException(i+"");}
public intsize(){int i=0;for(Node<T> p=this.head.next; p!=null; p=p.next)
i++;return i;}
public Node<T>insert(int i, T x){if(x==null)
throw new NullPointerException("x==null");
Node<T> front=this.head;for(int j=0; front.next!=null && j<i; j++)
front = front.next;
front.next = new Node<T>(x, front.next);return front.next;}
public Node<T>insert(T x){returninsert(Integer.MAX_VALUE, x);}
public T remove(int i){
Node<T> front=this.head;for(int j=0; front.next!=null && j<i; j++)
front = front.next;if(i>=0&& front.next!=null){
T old = front.next.data;
front.next = front.next.next;return old;}return null;}
public T find(int i){
Node<T> front=this.head;for(int j=0; front.next!=null && j<i; j++)
front = front.next;if(i>=0&& front.next!=null){
T old = front.next.data;return old;}return null;}
public voidclear(){
this.head.next=null;}
public Node<T>search(T key){for(Node<T> p=this.head.next; p!=null; p=p.next)if(key.equals(p.data))return p;return null;}
public boolean contains(T key){return this.search(key)!=null;}
public Node<T>insertDifferent(T x){
Node<T> front=this.head, p=front.next;//front是p的前驱结点while(p!=null &&!p.data.equals(x))//顺序查找{
front = p;
p = p.next;}if(p!=null)//查找成功,元素重复,不插入,返回p结点{
System.out.println("x="+x+",元素重复,未插入。");return p;}return front.next = new Node<T>(x,null);//尾插入值为x结点,返回插入结点}
public T remove(T key)//删除首个与key相等元素结点,返回被删除元素;查找不成功返回null{
Node<T> front=this.head, p=front.next;while(p!=null &&!key.equals(p.data)){
front = p;
p=p.next;}if(p!=null){
front.next = p.next;return p.data;}return null;}
public SinglyList(SinglyList<T> list)//深拷贝构造方法,复制单链表list的所有结点{this();//创建空单链表,只有头结点
Node<T> rear=this.head;for(Node<T> p=list.head.next; p!=null; p=p.next)//p遍历list单链表{
rear.next = new Node<T>(p.data, null);//复制结点尾插入到this单链表
rear = rear.next;//指向this单链表尾}}
public boolean equals(Object obj)//比较两条单链表是否相等,覆盖Object类的equals(obj)方法{if(obj == this)return true;if(!(obj instanceof SinglyList<?>))return false;
Node<T> p=this.head.next;
Node<T> q=((SinglyList<T>)obj).head.next;while(p!=null && q!=null && p.data.equals(q.data)){
p=p.next;
q=q.next;}return p==null && q==null;}
public String toString(){
String str=this.getClass().getName()+"(";for(Node<T> p=this.head.next;p!=null;p=p.next){
str+=p.data.toString();if(p.next!=null)
str+=",";}return str+")";}
public staticvoidmain(String []args){
String values[]={"a","b","c","d"};
SinglyList<String> list=new SinglyList<String>(values);
System.out.println(list.toString());
System.out.println(list.find(2));}}
反转单链表
public class SinglyList_reverse
{
public static<T> SinglyList<T>createReverse(T[] values){
SinglyList<T> list = new SinglyList<T>();//创建空单链表,只有头结点for(int i=0; i<values.length; i++)
list.head.next = new Node<T>(values[i], list.head.next);//头插入return list;//返回单链表对象引用}//将单链表逆转,泛型方法,返回值类型前声明类型参数T
public static<T>voidreverse(SinglyList<T> list){
Node<T> p=list.head.next, front=list.head;//head必须声明为public while(p!=null){
Node<T> succ = p.next;//succ是p结点的后继结点
p.next = front;//使p.next指向p结点的前驱结点
front = p;
p = succ;//p到达后继结点}
list.head.next = front;//设置头结点的地址域指向原单链表的最后一个结点}
public staticvoidmain(String args[]){
String[] values={"A","B","C","D","E","F"};
SinglyList<String> lista = new SinglyList<String>(values);
System.out.print("lista = "+lista.toString());reverse(lista);
System.out.println(",逆转后 "+lista.toString());
SinglyList<String> listb =createReverse(values);
System.out.print("listb = "+listb.toString());
System.out.println(",lista.equals(listb)? "+lista.equals(listb));}}
public interface Stack<T>{
public abstract boolean isEmpty();
public abstract voidpush(T x);
public abstract T peek();
public abstract T pop();}
public final class LinkedStack<T> implements Stack<T>{
private SinglyList<T> list;
public LinkedStack(){
this.list = new SinglyList<T>();}
public boolean isEmpty(){return this.list.isEmpty();}
public voidpush(T x){
this.list.insert(0, x);}
public T peek(){return this.list.get(0);}
public T pop(){return this.list.remove(0);}
public intlength(){return list.size();}
public T top(){return list.find(0);}
public T top_parent(){return list.find(1);}
public String toString(){return this.getClass().getName()+" "+this.list.toString();}
public staticvoidmain(String []args){
LinkedStack<String> stack= new LinkedStack();
stack.push("A");
stack.push("B");
stack.push("C");//stack.push("D");
System.out.println(stack.toString());
System.out.println(""+stack.length());}}