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);
}
}
@Override
public 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);
}
}
@Override
public 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;
}
@Override
public 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、13
bt.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;
}