双向循环链表(插入,删除,就地逆置)

来源:互联网 发布:淘宝客服自动回复语录 编辑:程序博客网 时间:2024/05/01 15:53
package design;import java.util.Scanner;//循环双链表public class LinkedList<AnyType>  {    private int theSize;    private Node<AnyType> beginMarker;    private Node<AnyType> endMarker;        class Node<AnyType>{          //定义匿名类Nodepublic AnyType data;public Node<AnyType> prev;public Node<AnyType> next;public Node(AnyType d,Node<AnyType> p,Node<AnyType> n){this.data=d;this.prev=p;this.next=n;}}public LinkedList(){                         //构造方法beginMarker=new Node<AnyType>(null,endMarker,endMarker);endMarker=new Node<AnyType>(null,beginMarker,beginMarker);beginMarker.next=endMarker;theSize=0;}public int size(){                     return theSize;}public Node<AnyType> getNode(int idx){             //返回idx对应的结点Node<AnyType> p=null;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;    }public boolean add(AnyType x){     //插入元素add(size(),x);return true;}private void add(int idx,AnyType x){if(idx>size()||idx<0){System.out.println("输入错误");}else{Node<AnyType> p;p=getNode(idx);Node<AnyType> newNode=new Node<AnyType>(x,p.prev,p);newNode.prev.next=newNode;p.prev=newNode;theSize++;}}public AnyType remove(int idx){              //删除元素if(idx>size()||idx<0){System.out.println("无法找到该节点");return null;}elsereturn remove(getNode(idx));}public AnyType remove(Node<AnyType> p){p.next.prev=p.prev;p.prev.next=p.next;theSize--;return p.data;}public void addFirst(AnyType data){add(0,data);}public void addLast(AnyType data){add(size(),data);}public void trs(){     Node p=beginMarker;     while(p.next!=beginMarker){     Node q=p;     Node r=p.next;     q.next=q.prev;     q.prev=r;     p=p.prev;     }     Node q=p;     Node r=p.next;     q.next=q.prev;     q.prev=r;     Node s=beginMarker;     beginMarker=endMarker;     endMarker=s;          int i=0;     for(Node x=beginMarker.next;x!=endMarker;x=x.next){     System.out.println(i+": "+x.data);     i++;     }     i=0;}public void print(){int i=0;for(Node x=beginMarker.next;x.next!=beginMarker;x=x.next){System.out.println(i+": "+x.data);i++;}i=0;}public static void main(String[] args) {      //验证部分LinkedList<String> La=new LinkedList<String>();System.out.println("1:创建链表");System.out.println("2:添加结点");System.out.println("3:删除结点");System.out.println("4:添加第一个");System.out.println("5:添加最后一个");System.out.println("6 :转置");System.out.println("请输入要进行的操作");Scanner sc=new Scanner(System.in);boolean flag=true;while(flag){  System.out.println("请输入您的要进行的操作:");int c=sc.nextInt();switch(c){   case 1: System.out.println("请输入数据个数");           int n=sc.nextInt();           System.out.println("输入数据");           for(int i=0;i<n;i++){           String data=sc.next();           La.add(data);           }           La.print();           break;   case 2: System.out.println("输入数据的插入位置和数据");           int w=sc.nextInt();           String data=sc.next();           La.add(w,data);           La.print();           break;   case 3: System.out.println("输入要删除结点的位置");           int q=sc.nextInt();           La.remove(q);           La.print();break;   case 4: System.out.println("输入要添加的数据");           String d=sc.next();           La.addFirst(d);           La.print();break;   case 5: System.out.println("输入要添加的数据");                   String da=sc.next();                   La.addLast(da);                    La.print();break;   case 6: La.trs();       break;   default :System.out.println("您输错了,请重新输入");break;}}}}

0 0
原创粉丝点击