第一章链表

今天写双向循环链表的java代码实现
class Node<AnyType>{
	public AnyType data;
	public Node<AnyType>prev;
	public Node<AnyType>next;
	public Node(){
		data=null;
		prev=null;
		next=null;
	}
	public Node(AnyType d,Node<AnyType> p,Node<AnyType>n){
		data=d;
		prev=p;
		next=n;
	}
}
public class MyDoubleCircularLinkedList<AnyType> {
	private int theSize=0;
	private int modCount=0;
	private Node beginMarker;
    private Node endMarker;
    public void nizhi()//就地逆置的代码实现
    {
    	
       Node c,d;
       d=beginMarker;
       c=beginMarker;
       for(int i=0;i<theSize+2;i++){
    	   Node a=c.prev;
    	   Node b=c.next;
    	   c.prev=b;
    	  c.next=a;
    	  c=c.next;
    	  
    	   
       }
       beginMarker=endMarker;
       endMarker=d;

    }
	public MyDoubleCircularLinkedList(){
           beginMarker =new Node();	
           endMarker=new Node();
           beginMarker.prev=endMarker;
           endMarker.next=beginMarker;
           endMarker.prev=beginMarker;
           beginMarker.next=endMarker;
           theSize=0;
          
     }
	public int Size(){
		return theSize;
	}
	public boolean isEmpty(){
		return Size()==0;
	}
	public boolean add(AnyType x){
		add(Size(),x);
		return true;
	}
	public void add(int idx,AnyType x){
		addBefore(getNode(idx),x);
	}
	private Node getNode(int idx){
		Node p;
		if(idx<0||idx>Size())
			System.out.println("超出范围");
		if(idx<Size()/2){//从前向后找
			p=beginMarker.next;
	        for(int i=0;i<idx;i++)
	        	p=p.next;
	        
		}
		else{
			p=endMarker;
			for(int i=Size();i>idx;i--)
				p=p.prev;
		}
		return p;
	}
	
	private void addBefore(Node p,AnyType x){
		Node newNode=new Node(x,p.prev,p);
		newNode.prev.next=newNode;
		p.prev=newNode;
		theSize++;
		modCount++;
	}
	public AnyType set(int idx,AnyType x){
		Node p=getNode(idx);
		AnyType oldVal=(AnyType) p.data;
		p.data=x;
		return oldVal;
		
	}
	public AnyType remove(int idx){
		return remove(getNode(idx));
	}
	private AnyType remove(Node p){
		p.next.prev=p.prev;
		p.prev.next=p.next;
		theSize--;
		modCount++;
		return (AnyType) p.data;
	}
	public void Inverse(MyDoubleCircularLinkedList list){
		int size=Size();
		for(int i=size-1;i>=0;i--)
		{
			list.add(this.getNode(i).data);
		}
	}
	public void print(){
		Node firstNode=beginMarker.next;
		if(firstNode.data==null){
			System.out.println("链表为空");
		}
		else{
			while(firstNode.data!=null){
				System.out.println(firstNode.data);
				firstNode=firstNode.next;
			}
		}
	}
	

	public static void main(String[]args){
		System.out.println("下面是展示的时间了,欢迎观看双向循环链表的展示");
		MyDoubleCircularLinkedList<Integer> list=new MyDoubleCircularLinkedList<Integer>();
		System.out.println("请输入要添加的节点数目");
		Scanner in=new Scanner(System.in);
		int m=in.nextInt();
		System.out.println("请输入节点");
		int a;
		for(int i=0;i<m;i++){
			a=in.nextInt();
			list.add(a);
		}
		list.print();
		System.out.println("请输入要删除的节点的位置");
		int b;
		b=in.nextInt();
		list.remove(b);
		list.print();
		System.out.println("请输入要插入节点的位置和节点");
		int q,p;
		q=in.nextInt();
		p=in.nextInt();
		list.add(q, p);
		list.print();
		System.out.println("请插入第一个节点");
		p=in.nextInt();
		list.add(0, p);
		list.print();
		System.out.println("插入最后一个节点");
		p=in.nextInt();
		list.add(list.Size(), p);
		
		
		list.print();
	System.out.println("下面是就地转置了");
		
		list.nizhi();
		
		list.print();
		System.out.println("谢谢观赏,bye");
	}
     
     
     
     
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值