• 双向环形链表自己扩展

    image.png
    image.png


    1. //小孩节点
    2. @Data
    3. @AllArgsConstructor
    4. @NoArgsConstructor
    5. @ToString
    6. public class Child {
    7. //序号
    8. private Integer no;
    9. //下一个节点
    10. private Child next;
    11. public Child(Integer no) {
    12. this.no = no;
    13. }
    14. }
    1. //单向环形列表
    2. public class SingleLinkedList {
    3. private static Child first = new Child(1);
    4. static {
    5. first.setNext(first);
    6. }
    7. //添加小孩节点 , 构建环形列表
    8. public void addChild(Integer newNo){addChildR(first,newNo);}
    9. private void addChildR(Child child,Integer newNo){
    10. if(child.getNo() == newNo){
    11. System.out.println("编号重复");
    12. return;
    13. }
    14. if(child.getNext().getNo() != first.getNo()){
    15. addChildR(child.getNext(),newNo);
    16. }else{
    17. Child child1 = new Child(newNo);
    18. child1.setNext(first);
    19. child.setNext(child1);
    20. }
    21. }
    22. //遍历
    23. public void childList(){ childListR(first);}
    24. private void childListR(Child child){
    25. System.out.printf("编号: %d",child.getNo());
    26. System.out.println();
    27. if(child.getNext().getNo() != first.getNo()){
    28. childListR(child.getNext());
    29. }else{
    30. return;
    31. }
    32. }
    33. /**
    34. * 数小孩 出圈
    35. * @param starNo 表示从第几个小孩开始数
    36. * @param countNum 表示数几下
    37. */
    38. public void childCount(int starNo,int countNum){childCountR(getChild(starNo),countNum,0,getChild(childSum()));}
    39. /**
    40. *
    41. * @param child
    42. * @param countNum 需要数几下
    43. * @param countNumnow 当前数了几次
    44. */
    45. private void childCountR(Child child,int countNum,int countNumnow,Child pre){
    46. if(countNum == countNumnow+1){
    47. System.out.printf("编号: %d",child.getNo());
    48. System.out.println();
    49. //出圈
    50. pre.setNext(child.getNext());
    51. countNumnow = 0;
    52. }else{
    53. countNumnow++;
    54. }
    55. if(child.getNext().getNo() != child.getNo()){
    56. childCountR(child.getNext(),countNum,countNumnow,child);
    57. }else{
    58. System.out.printf("编号: %d",child.getNext().getNo());
    59. System.out.println();
    60. }
    61. }
    62. public Child getChild(int counNum){ if(counNum<=0) counNum=1;return getChildR(first,counNum,1);}
    63. /**
    64. * 获取正数第 n 个小孩节点
    65. * @param child
    66. * @param counNum 需要数到第几个
    67. * @param counNumNow 当前数到多少
    68. * @return
    69. */
    70. private Child getChildR(Child child,int counNum,int counNumNow){
    71. if(counNum != counNumNow){
    72. counNumNow++;
    73. return getChildR(child.getNext(),counNum,counNumNow);
    74. }else{
    75. return child;
    76. }
    77. }
    78. //获取总结点数量
    79. public int childSum(){ return childSumR(first,1); }
    80. private int childSumR(Child child,int count){
    81. if(child.getNext().getNo() != first.getNo()){
    82. count++;
    83. return childSumR(child.getNext(),count);
    84. }else{
    85. return count;
    86. }
    87. }
    88. }
    public class Test {
        public static void main(String[] args) {
            SingleLinkedList singleLinkedList = new SingleLinkedList();
    
            singleLinkedList.addChild(2);
            singleLinkedList.addChild(3);
            singleLinkedList.addChild(4);
            singleLinkedList.addChild(5);
            singleLinkedList.addChild(6);
    
            singleLinkedList.childList();
            System.out.println("--------------------------");
            singleLinkedList.childCount(1,2);
    
            Child child = singleLinkedList.getChild(5);
        }
    }