第一章链表
2016-01-29 19:56
441 查看
今天写双向循环链表的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"); } }
相关文章推荐
- C++ 知识点
- 单例模式
- undefined reference to `sin'问题解决
- unknown software exception
- Html书签的使用
- mcm C 数据抓取
- ARP原理及双网卡设备arp、ping查询问题
- Fragment处理与Activity状态丢失(State Loss)
- Longest Substring Without Repeating Characters
- android 上传文件到服务器
- hdoj 2187悼念512汶川大地震遇难同胞——老人是真饿了
- Hunan University 2008 the 4th Programming Contest - 11135 - The ones to remain
- 数据库分库分表(sharding)系列
- 关于如何彻底消除unity中的弹力
- Java DOM 处理XML时调用getChildNodes函数,子节点个数问题
- android 属性动画之 ObjectAnimator
- 海水截面模拟
- 2016.01.29--h5第七天之css
- 关于使用git进行代码托管下文件的恢复
- UVA 11624 Fire! BFS搜索