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

  1. package design;
  2. import java.util.Scanner;
  3. //循环双链表
  4. public class LinkedList<AnyType> {
  5. private int theSize;
  6. private Node<AnyType> beginMarker;
  7. private Node<AnyType> endMarker;
  8. class Node<AnyType>{ //定义匿名类Node
  9. public AnyType data;
  10. public Node<AnyType> prev;
  11. public Node<AnyType> next;
  12. public Node(AnyType d,Node<AnyType> p,Node<AnyType> n){
  13. this.data=d;
  14. this.prev=p;
  15. this.next=n;
  16. }
  17. }
  18. public LinkedList(){ //构造方法
  19. beginMarker= new Node<AnyType>( null,endMarker,endMarker);
  20. endMarker= new Node<AnyType>( null,beginMarker,beginMarker);
  21. beginMarker.next=endMarker;
  22. theSize= 0;
  23. }
  24. public int size(){
  25. return theSize;
  26. }
  27. public Node<AnyType> getNode(int idx){ //返回idx对应的结点
  28. Node<AnyType> p= null;
  29. if(idx< 0||idx>size())
  30. System.out.println( “无法找到该点”);
  31. if(idx<size()/ 2){
  32. p=beginMarker.next;
  33. for( int i= 0;i<idx;i++)
  34. p=p.next;
  35. }
  36. else{
  37. p=endMarker;
  38. for( int i=size();i>idx;i–)
  39. p=p.prev;
  40. }
  41. return p;
  42. }
  43. public boolean add(AnyType x){ //插入元素
  44. add(size(),x);
  45. return true;
  46. }
  47. private void add(int idx,AnyType x){
  48. if(idx>size()||idx< 0){
  49. System.out.println( “输入错误”);
  50. } else{
  51. Node<AnyType> p;
  52. p=getNode(idx);
  53. Node<AnyType> newNode= new Node<AnyType>(x,p.prev,p);
  54. newNode.prev.next=newNode;
  55. p.prev=newNode;
  56. theSize++;
  57. }
  58. }
  59. public AnyType remove(int idx){ //删除元素
  60. if(idx>size()||idx< 0){
  61. System.out.println( “无法找到该节点”);
  62. return null;
  63. } else
  64. return remove(getNode(idx));
  65. }
  66. public AnyType remove(Node<AnyType> p){
  67. p.next.prev=p.prev;
  68. p.prev.next=p.next;
  69. theSize–;
  70. return p.data;
  71. }
  72. public void addFirst(AnyType data){
  73. add( 0,data);
  74. }
  75. public void addLast(AnyType data){
  76. add(size(),data);
  77. }
  78. public void trs(){
  79. Node p=beginMarker;
  80. while(p.next!=beginMarker){
  81. Node q=p;
  82. Node r=p.next;
  83. q.next=q.prev;
  84. q.prev=r;
  85. p=p.prev;
  86. }
  87. Node q=p;
  88. Node r=p.next;
  89. q.next=q.prev;
  90. q.prev=r;
  91. Node s=beginMarker;
  92. beginMarker=endMarker;
  93. endMarker=s;
  94. int i= 0;
  95. for(Node x=beginMarker.next;x!=endMarker;x=x.next){
  96. System.out.println(i+ ": “+x.data);
  97. i++;
  98. }
  99. i= 0;
  100. }
  101. public void print(){
  102. int i= 0;
  103. for(Node x=beginMarker.next;x.next!=beginMarker;x=x.next){
  104. System.out.println(i+ ”: "+x.data);
  105. i++;
  106. }
  107. i= 0;
  108. }
  109. public static void main(String[] args) {
  110. //验证部分
  111. LinkedList<String> La= new LinkedList<String>();
  112. System.out.println( “1:创建链表”);
  113. System.out.println( “2:添加结点”);
  114. System.out.println( “3:删除结点”);
  115. System.out.println( “4:添加第一个”);
  116. System.out.println( “5:添加最后一个”);
  117. System.out.println( “6 :转置”);
  118. System.out.println( “请输入要进行的操作”);
  119. Scanner sc= new Scanner(System.in);
  120. boolean flag= true;
  121. while(flag){
  122. System.out.println( “请输入您的要进行的操作:”);
  123. int c=sc.nextInt();
  124. switch©{
  125. case 1: System.out.println( “请输入数据个数”);
  126. int n=sc.nextInt();
  127. System.out.println( “输入数据”);
  128. for( int i= 0;i<n;i++){
  129. String data=sc.next();
  130. La.add(data);
  131. }
  132. La.print();
  133. break;
  134. case 2: System.out.println( “输入数据的插入位置和数据”);
  135. int w=sc.nextInt();
  136. String data=sc.next();
  137. La.add(w,data);
  138. La.print();
  139. break;
  140. case 3: System.out.println( “输入要删除结点的位置”);
  141. int q=sc.nextInt();
  142. La.remove(q);
  143. La.print(); break;
  144. case 4: System.out.println( “输入要添加的数据”);
  145. String d=sc.next();
  146. La.addFirst(d);
  147. La.print(); break;
  148. case 5: System.out.println( “输入要添加的数据”);
  149. String da=sc.next();
  150. La.addLast(da);
  151. La.print(); break;
  152. case 6: La.trs();
  153. break;
  154. default :System.out.println( “您输错了,请重新输入”); break;
  155. }
  156. }
  157. }
  158. }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值