1、链表
使用一个链表管理类实现链表的增加、删除等功能,这其中用到了递归
/**链表一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到是下一个节点的指针(Pointer)。链表与数组:线性数据结构数组适合查找,遍历,固定长度链表适合插入,删除,不宜过长,否则会导致遍历性能下降*/public class Test15{public static void main(String[] args){NodeManager nm = new NodeManager();System.out.println("------add----------");nm.add(5);nm.add(4);nm.add(3);nm.add(2);nm.add(1);nm.print();System.out.println("-------del---------");nm.del(3);nm.print();System.out.println("-------find---------");System.out.println(nm.find(1));System.out.println("-------update---------");nm.update(1,10);nm.print();System.out.println("-------insert---------");nm.insert(1,20);nm.print();}}class NodeManager{private Node root;//根节点private int currentIndex = 0;//节点的序号,每次操作从0开始//添加public void add(int data){if(root==null){root = new Node(data);}else{root.addNode(data);}}//删除public void del(int data){if(root==null)return;if(root.getData()==data){root = root.next;}else{root.delNode(data);}}//打印所有public void print(){if(root!=null){System.out.print(root.getData()+"->");root.printNode();System.out.println();}}//查找是否存在节点public boolean find(int data){if(root==null)return false;if(root.getData()==data){return true;}else{return root.findNode(data);}}//更新public boolean update(int oldData,int newData){if(root==null)return false;if(root.getData()==oldData){root.setData(newData);return true;}else{return root.updateNode(oldData,newData);}}//向索引之前插入public void insert(int index,int data){if(index<0)return;currentIndex = 0; //节点序号if(index==currentIndex){Node newNode = new Node(data);newNode.next = root;root = newNode;}else{root.insertNode(index,data);}}private class Node{private int data;private Node next; //把当前类型作为属性public Node(int data){this.data = data;}public void setData(int data){this.data = data;}public int getData(){return data;}//添加节点public void addNode(int data){if(this.next==null){this.next = new Node(data);}else{this.next.addNode(data);}}//删除节点public void delNode(int data){if(this.next!=null){if(this.next.data==data){this.next = this.next.next;}else{this.next.delNode(data);}}}//输出所有节点public void printNode(){if(this.next!=null){System.out.print(this.next.data+"->");this.next.printNode();}}//查找节点是否存在public boolean findNode(int data){if(this.next!=null){if(this.next.data==data){return true;}else{return this.next.findNode(data);}}return false;}//修改节点public boolean updateNode(int oldData,int newData){if(this.next!=null){if(this.next.data==oldData){this.next.data = newData;return true;}else{return this.next.updateNode(oldData,newData);}}return false;}//插入节点public void insertNode(int index,int data){currentIndex++;if(index==currentIndex){Node newNode = new Node(data);newNode.next = this.next;this.next = newNode;}else{this.next.insertNode(index,data);}}}}
------add----------5->4->3->2->1->-------del---------5->4->2->1->-------find---------true-------update---------5->4->2->10->-------insert---------5->20->4->2->10->
在链表管理类中写一个方法实现链表反转、以及链表自身的打印全部
public class Test17 {public static void main(String[] args) {ListNode n1=new ListNode(1);ListNode n2=new ListNode(2);ListNode n3=new ListNode(3);ListNode n4=new ListNode(4);ListNodeManage ls=new ListNodeManage();ls.println();System.out.println("----------------");ls.add(n1);ls.add(n2);ls.add(n3);ls.add(n4);ls.println();System.out.println("----------------");ListNode listNode = ls.reverseNode(n2);listNode.showNodes();}}class ListNodeManage{private ListNode root;public ListNode reverseNode(ListNode node){ListNode res=null;ListNode n=null;while(node!=null){n=node.getNext();node.setNext(res);res=node;node=n;}return res;}public void println(){if(root==null){System.out.println("链表为空");}else{System.out.println(root);root.printNode();}}public void add(ListNode node){if(root==null){root=node;}else {root.addNode(node);}}@Overridepublic String toString() {return "ListNodeManage{" +"root=" + root +'}';}}class ListNode{private int val;private ListNode next;public void showNodes(){System.out.println(this);this.showNextNode();}private void showNextNode(){if(this.next!=null){System.out.println(this.next);this.next.showNextNode();}}public void printNode(){if(this.next!=null){System.out.println(this.next);this.next.printNode();}}public void addNode(ListNode node){if(this.next==null){this.next=node;}else{this.next.addNode(node);}}@Overridepublic String toString() {return "ListNode{" +"val=" + val +'}';}public ListNode(int val) {this.val = val;}public ListNode() {}public int getVal() {return val;}public void setVal(int val) {this.val = val;}public ListNode getNext() {return next;}public void setNext(ListNode next) {this.next = next;}}
链表为空----------------ListNode{val=1}ListNode{val=2}ListNode{val=3}ListNode{val=4}----------------ListNode{val=4}ListNode{val=3}ListNode{val=2}Process finished with exit code 0
删除链表中的某个元素
package com.chang;public class test {public static void main(String[] args) {listNode li1=new listNode(2);listNode li2=new listNode(1);listNode li3=new listNode(5);listNode li4=new listNode(9);li1.next=li2;li2.next=li3;li3.next=li4;// printInfo(li1);int val=1;listNode root=new listNode(-1);listNode pre=root;listNode cur=li1;while(cur!=null){if(cur.val!=val){pre.next=cur;pre=pre.next;cur=cur.next;}else{cur=cur.next;}}printInfo(root.next );}private static class listNode{int val;listNode next=null;public listNode(int val) {this.val = val;}@Overridepublic String toString() {return "listNode{" +"val=" + val +'}';}}private static void printInfo(listNode node){System.out.println("打印所有节点");while(node!=null){System.out.println(node);node=node.next;}System.out.println("--------------");}}
2、二叉树
树是一种重要的非线性数据结构, 直观地看, 它是数据元素(在树中称为结点) 按分支关系组织起来的结构。
二叉树(Binary Tree) 是每个节点最多有两个子树的有序树。 通常子树被称作“ 左子树” 和“ 右子树”。
二叉树算法的排序规则:
- 选择第一个元素作为根节点
- 之后如果元素大于根节点放在右子树, 如果元素小于根节点, 则放在左子树
- 最后按照中序遍历的方式进行输出, 则可以得到排序的结果(左->根->右)
8、 3、 10、 1、 6、 14、 4、 7、 13

public class BinaryTree {private Node root;//添加节点public void add(int data){if(root==null){root = new Node(data);}else{root.addNode(data);}}//输出节点public void print(){root.printNode();}private class Node{private int data;private Node left;private Node right;public Node(int data){this.data = data;}public void addNode(int data){if(this.data>data){if(this.left==null){this.left = new Node(data);}else{this.left.addNode(data);}}else{if(this.right==null){this.right = new Node(data);}else{this.right.addNode(data);}}}//中序遍历(先序遍历,后序遍历)public void printNode(){if(this.left!=null){this.left.printNode();}System.out.print(this.data+"->");if(this.right!=null){this.right.printNode();}}}}
public class BinaryTreeDemo {public static void main(String[] args) {BinaryTree bt = new BinaryTree();// 8、3、10、1、6、14、4、7、13bt.add(8);bt.add(3);bt.add(10);bt.add(1);bt.add(6);bt.add(14);bt.add(4);bt.add(7);bt.add(13);bt.print();}}
/public static int TreeDepth(BinaryTree.Node root){if(root==null){return 0;}int l=TreeDepth(root.left);int r=TreeDepth(root.right);return Math.max(l,r)+1;}
