版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/qq_37808895,未经博主允许不得转载。 https://blog.csdn.net/qq_37808895/article/details/88624170
目录
结点类
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 void set(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 int size(){
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)
{
return insert(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 void clear()
{
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 static void main(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> void reverse(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 static void main(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 class CirSinglyList<T> extends Object{
public Node<T> head;
public CirSinglyList(){
this.head=new Node<T>();
head.next=this.head;
}
public CirSinglyList(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;
}
rear.next=this.head;
}
public String toString(){
String str=this.getClass().getName()+"(";
for(Node<T> p=this.head.next;p!=this.head;p=p.next){
str+=p.data.toString();
if(p.next!=this.head)
str+=",";
}
return str+")";
}
boolean removeAll(SinglyList<T> list){
boolean IS=false;
Node<T> p = list.head.next;
while(p!=null){
Node<T> front=this.head;
Node<T> q=front.next;
while(q!=this.head&&!p.data.equals(q.data)){
front = q;
q=q.next;
}
if(q!=this.head){
front.next=q.next;
IS=true;
}
p=p.next;
}
return IS;
}
public static void main(String arg[]){
String a[]={"1","2","3","4"};
String b[]={"1","2","3","4","5","6"};
String c[]={"7","8"};
SinglyList<String> list1=new SinglyList<String>(a);
CirSinglyList<String> list2=new CirSinglyList<String>(b);
CirSinglyList<String> list3=new CirSinglyList<String>(c);
System.out.println(list1.toString());
System.out.println(list2.toString());
boolean d=list2.removeAll(list1);
boolean e=list3.removeAll(list1);
if(d)
System.out.println("list 2 success");
else
System.out.println("list 2 fail");
if(e)
System.out.println("list 3 success");
else
System.out.println("list 3 fail");
System.out.println(list1.toString());
System.out.println(list2.toString());
System.out.println(list3.toString());
}
}
栈的建立及链表进出栈
public interface Stack<T> {
public abstract boolean isEmpty();
public abstract void push(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 void push(T x){
this.list.insert(0, x);
}
public T peek()
{
return this.list.get(0);
}
public T pop()
{
return this.list.remove(0);
}
public int length(){
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 static void main(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());
}
}