1、链表

使用一个链表管理类实现链表的增加、删除等功能,这其中用到了递归

  1. /**
  2. 链表
  3. 一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,
  4. 而是在每一个节点里存到是下一个节点的指针(Pointer)。
  5. 链表与数组:线性数据结构
  6. 数组适合查找,遍历,固定长度
  7. 链表适合插入,删除,不宜过长,否则会导致遍历性能下降
  8. */
  9. public class Test15{
  10. public static void main(String[] args){
  11. NodeManager nm = new NodeManager();
  12. System.out.println("------add----------");
  13. nm.add(5);
  14. nm.add(4);
  15. nm.add(3);
  16. nm.add(2);
  17. nm.add(1);
  18. nm.print();
  19. System.out.println("-------del---------");
  20. nm.del(3);
  21. nm.print();
  22. System.out.println("-------find---------");
  23. System.out.println(nm.find(1));
  24. System.out.println("-------update---------");
  25. nm.update(1,10);
  26. nm.print();
  27. System.out.println("-------insert---------");
  28. nm.insert(1,20);
  29. nm.print();
  30. }
  31. }
  32. class NodeManager{
  33. private Node root;//根节点
  34. private int currentIndex = 0;//节点的序号,每次操作从0开始
  35. //添加
  36. public void add(int data){
  37. if(root==null){
  38. root = new Node(data);
  39. }else{
  40. root.addNode(data);
  41. }
  42. }
  43. //删除
  44. public void del(int data){
  45. if(root==null)return;
  46. if(root.getData()==data){
  47. root = root.next;
  48. }else{
  49. root.delNode(data);
  50. }
  51. }
  52. //打印所有
  53. public void print(){
  54. if(root!=null){
  55. System.out.print(root.getData()+"->");
  56. root.printNode();
  57. System.out.println();
  58. }
  59. }
  60. //查找是否存在节点
  61. public boolean find(int data){
  62. if(root==null)return false;
  63. if(root.getData()==data){
  64. return true;
  65. }else{
  66. return root.findNode(data);
  67. }
  68. }
  69. //更新
  70. public boolean update(int oldData,int newData){
  71. if(root==null)return false;
  72. if(root.getData()==oldData){
  73. root.setData(newData);
  74. return true;
  75. }else{
  76. return root.updateNode(oldData,newData);
  77. }
  78. }
  79. //向索引之前插入
  80. public void insert(int index,int data){
  81. if(index<0)return;
  82. currentIndex = 0; //节点序号
  83. if(index==currentIndex){
  84. Node newNode = new Node(data);
  85. newNode.next = root;
  86. root = newNode;
  87. }else{
  88. root.insertNode(index,data);
  89. }
  90. }
  91. private class Node{
  92. private int data;
  93. private Node next; //把当前类型作为属性
  94. public Node(int data){
  95. this.data = data;
  96. }
  97. public void setData(int data){
  98. this.data = data;
  99. }
  100. public int getData(){
  101. return data;
  102. }
  103. //添加节点
  104. public void addNode(int data){
  105. if(this.next==null){
  106. this.next = new Node(data);
  107. }else{
  108. this.next.addNode(data);
  109. }
  110. }
  111. //删除节点
  112. public void delNode(int data){
  113. if(this.next!=null){
  114. if(this.next.data==data){
  115. this.next = this.next.next;
  116. }else{
  117. this.next.delNode(data);
  118. }
  119. }
  120. }
  121. //输出所有节点
  122. public void printNode(){
  123. if(this.next!=null){
  124. System.out.print(this.next.data+"->");
  125. this.next.printNode();
  126. }
  127. }
  128. //查找节点是否存在
  129. public boolean findNode(int data){
  130. if(this.next!=null){
  131. if(this.next.data==data){
  132. return true;
  133. }else{
  134. return this.next.findNode(data);
  135. }
  136. }
  137. return false;
  138. }
  139. //修改节点
  140. public boolean updateNode(int oldData,int newData){
  141. if(this.next!=null){
  142. if(this.next.data==oldData){
  143. this.next.data = newData;
  144. return true;
  145. }else{
  146. return this.next.updateNode(oldData,newData);
  147. }
  148. }
  149. return false;
  150. }
  151. //插入节点
  152. public void insertNode(int index,int data){
  153. currentIndex++;
  154. if(index==currentIndex){
  155. Node newNode = new Node(data);
  156. newNode.next = this.next;
  157. this.next = newNode;
  158. }else{
  159. this.next.insertNode(index,data);
  160. }
  161. }
  162. }
  163. }
  1. ------add----------
  2. 5->4->3->2->1->
  3. -------del---------
  4. 5->4->2->1->
  5. -------find---------
  6. true
  7. -------update---------
  8. 5->4->2->10->
  9. -------insert---------
  10. 5->20->4->2->10->

在链表管理类中写一个方法实现链表反转、以及链表自身的打印全部

  1. public class Test17 {
  2. public static void main(String[] args) {
  3. ListNode n1=new ListNode(1);
  4. ListNode n2=new ListNode(2);
  5. ListNode n3=new ListNode(3);
  6. ListNode n4=new ListNode(4);
  7. ListNodeManage ls=new ListNodeManage();
  8. ls.println();
  9. System.out.println("----------------");
  10. ls.add(n1);
  11. ls.add(n2);
  12. ls.add(n3);
  13. ls.add(n4);
  14. ls.println();
  15. System.out.println("----------------");
  16. ListNode listNode = ls.reverseNode(n2);
  17. listNode.showNodes();
  18. }
  19. }
  20. class ListNodeManage{
  21. private ListNode root;
  22. public ListNode reverseNode(ListNode node){
  23. ListNode res=null;
  24. ListNode n=null;
  25. while(node!=null){
  26. n=node.getNext();
  27. node.setNext(res);
  28. res=node;
  29. node=n;
  30. }
  31. return res;
  32. }
  33. public void println(){
  34. if(root==null){
  35. System.out.println("链表为空");
  36. }else{
  37. System.out.println(root);
  38. root.printNode();
  39. }
  40. }
  41. public void add(ListNode node){
  42. if(root==null){
  43. root=node;
  44. }else {
  45. root.addNode(node);
  46. }
  47. }
  48. @Override
  49. public String toString() {
  50. return "ListNodeManage{" +
  51. "root=" + root +
  52. '}';
  53. }
  54. }
  55. class ListNode{
  56. private int val;
  57. private ListNode next;
  58. public void showNodes(){
  59. System.out.println(this);
  60. this.showNextNode();
  61. }
  62. private void showNextNode(){
  63. if(this.next!=null){
  64. System.out.println(this.next);
  65. this.next.showNextNode();
  66. }
  67. }
  68. public void printNode(){
  69. if(this.next!=null){
  70. System.out.println(this.next);
  71. this.next.printNode();
  72. }
  73. }
  74. public void addNode(ListNode node){
  75. if(this.next==null){
  76. this.next=node;
  77. }else{
  78. this.next.addNode(node);
  79. }
  80. }
  81. @Override
  82. public String toString() {
  83. return "ListNode{" +
  84. "val=" + val +
  85. '}';
  86. }
  87. public ListNode(int val) {
  88. this.val = val;
  89. }
  90. public ListNode() {
  91. }
  92. public int getVal() {
  93. return val;
  94. }
  95. public void setVal(int val) {
  96. this.val = val;
  97. }
  98. public ListNode getNext() {
  99. return next;
  100. }
  101. public void setNext(ListNode next) {
  102. this.next = next;
  103. }
  104. }
  1. 链表为空
  2. ----------------
  3. ListNode{val=1}
  4. ListNode{val=2}
  5. ListNode{val=3}
  6. ListNode{val=4}
  7. ----------------
  8. ListNode{val=4}
  9. ListNode{val=3}
  10. ListNode{val=2}
  11. Process finished with exit code 0

删除链表中的某个元素

  1. package com.chang;
  2. public class test {
  3. public static void main(String[] args) {
  4. listNode li1=new listNode(2);
  5. listNode li2=new listNode(1);
  6. listNode li3=new listNode(5);
  7. listNode li4=new listNode(9);
  8. li1.next=li2;
  9. li2.next=li3;
  10. li3.next=li4;
  11. // printInfo(li1);
  12. int val=1;
  13. listNode root=new listNode(-1);
  14. listNode pre=root;
  15. listNode cur=li1;
  16. while(cur!=null){
  17. if(cur.val!=val){
  18. pre.next=cur;
  19. pre=pre.next;
  20. cur=cur.next;
  21. }else{
  22. cur=cur.next;
  23. }
  24. }
  25. printInfo(root.next );
  26. }
  27. private static class listNode{
  28. int val;
  29. listNode next=null;
  30. public listNode(int val) {
  31. this.val = val;
  32. }
  33. @Override
  34. public String toString() {
  35. return "listNode{" +
  36. "val=" + val +
  37. '}';
  38. }
  39. }
  40. private static void printInfo(listNode node){
  41. System.out.println("打印所有节点");
  42. while(node!=null){
  43. System.out.println(node);
  44. node=node.next;
  45. }
  46. System.out.println("--------------");
  47. }
  48. }

2、二叉树

树是一种重要的非线性数据结构, 直观地看, 它是数据元素(在树中称为结点) 按分支关系组织起来的结构。

二叉树(Binary Tree) 是每个节点最多有两个子树的有序树。 通常子树被称作“ 左子树” 和“ 右子树”。

二叉树算法的排序规则:

  1. 选择第一个元素作为根节点
  2. 之后如果元素大于根节点放在右子树, 如果元素小于根节点, 则放在左子树
  3. 最后按照中序遍历的方式进行输出, 则可以得到排序的结果(左->根->右)

8、 3、 10、 1、 6、 14、 4、 7、 13

20、数据结构 - 图1

  1. public class BinaryTree {
  2. private Node root;
  3. //添加节点
  4. public void add(int data){
  5. if(root==null){
  6. root = new Node(data);
  7. }else{
  8. root.addNode(data);
  9. }
  10. }
  11. //输出节点
  12. public void print(){
  13. root.printNode();
  14. }
  15. private class Node{
  16. private int data;
  17. private Node left;
  18. private Node right;
  19. public Node(int data){
  20. this.data = data;
  21. }
  22. public void addNode(int data){
  23. if(this.data>data){
  24. if(this.left==null){
  25. this.left = new Node(data);
  26. }else{
  27. this.left.addNode(data);
  28. }
  29. }else{
  30. if(this.right==null){
  31. this.right = new Node(data);
  32. }else{
  33. this.right.addNode(data);
  34. }
  35. }
  36. }
  37. //中序遍历(先序遍历,后序遍历)
  38. public void printNode(){
  39. if(this.left!=null){
  40. this.left.printNode();
  41. }
  42. System.out.print(this.data+"->");
  43. if(this.right!=null){
  44. this.right.printNode();
  45. }
  46. }
  47. }
  48. }
  1. public class BinaryTreeDemo {
  2. public static void main(String[] args) {
  3. BinaryTree bt = new BinaryTree();
  4. // 8、3、10、1、6、14、4、7、13
  5. bt.add(8);
  6. bt.add(3);
  7. bt.add(10);
  8. bt.add(1);
  9. bt.add(6);
  10. bt.add(14);
  11. bt.add(4);
  12. bt.add(7);
  13. bt.add(13);
  14. bt.print();
  15. }
  16. }
  1. /
  2. public static int TreeDepth(BinaryTree.Node root){
  3. if(root==null){
  4. return 0;
  5. }
  6. int l=TreeDepth(root.left);
  7. int r=TreeDepth(root.right);
  8. return Math.max(l,r)+1;
  9. }