-------------------------单向链表
1 //自制单向链表 2 class MyList { 3 private Cell head; 4 private int length; 5 class Cell { 6 private String data; 7 private Cell next; 8 public Cell(String data) { 9 this.data = data; 10 } 11 } 12 public void add(String data) { 13 Cell c = new Cell(data); 14 Cell tail = getTail(); 15 if (tail == null) { 16 head = c; 17 } else { 18 tail.next = c; 19 } 20 this.length++; 21 } 22 public int size() { 23 return this.length; 24 } 25 public Cell getTail() { 26 if (head == null) { 27 return null; 28 } 29 Cell p = head; 30 while (p.next != null) { 31 p = p.next; 32 } 33 return p; 34 } 35 public String get(int index) { 36 if (index >= this.length) { 37 throw new IndexOutOfBoundsException("下标越界"); 38 } 39 Cell p = head; 40 for (int i = 0; i < index; i++) { 41 p = p.next; 42 } 43 return p.data; 44 } 45 } 46 public class Demo { 47 public static void main(String[] args) { 48 MyList list = new MyList(); 49 list.add("lala"); 50 list.add("hehe"); 51 list.add("haha"); 52 list.add("heihei"); 53 System.out.println(list.size()); 54 for (int i = 0; i < list.size(); i++) { 55 System.out.println(list.get(i)); 56 } 57 } 58 }
---------------------二叉树
1 /** 2 * 自定义二叉树,存放int型数据 中序排列 3 */ 4 class MyTree { 5 // 定义树根 6 private Node root; 7 // 定义二叉树节点 8 class Node { 9 private int data;// 存放数据 10 private Node left;// 左子树地址 11 private Node right;// 右子树地址 12 public Node(int data) { 13 // 初始化成员变量 14 this.data = data; 15 this.left = this.right = null; 16 } 17 /** 18 * 根据规则,把节点添加到二叉树中 19 * 20 * @param n 21 * 节点 22 */ 23 public void add(Node n) { 24 // 首先比较data的大小,大于根节点放在右边,小于根节点放在左边 25 if (this.data > n.data) { 26 if (this.left != null) { 27 this.left.add(n); 28 } else { 29 this.left = n; 30 } 31 } else { 32 if (this.right != null) { 33 this.right.add(n); 34 } else { 35 this.right = n; 36 } 37 } 38 } 39 public void bianLi() { 40 if (this.left != null) { 41 this.left.bianLi(); 42 } 43 System.out.println(this.data); 44 if (this.right != null) { 45 this.right.bianLi(); 46 } 47 } 48 } 49 /** 50 * 定义add方法 51 * 52 * @param data 53 * 要存放的数据 54 */ 55 public void add(int data) { 56 // 实例化一个节点 57 Node n = new Node(data); 58 // 添加到二叉树中,首先判断树是否存在,如果不存在,就把这个节点当做根节点 59 // 如果存在,调用Node的add方法,将节点添加进去 60 if (this.root == null) { 61 this.root = n; 62 } else { 63 this.root.add(n); 64 } 65 } 66 public void bianLi() { 67 if (this.root == null) { 68 System.out.println("空"); 69 } else { 70 this.root.bianLi(); 71 } 72 } 73 } 74 public class Demo3 { 75 public static void main(String[] args) { 76 MyTree tree = new MyTree(); 77 for (int i = 0; i < 20; i++) { 78 int num = (int) (Math.random() * 100 + 1); 79 tree.add(num); 80 } 81 tree.bianLi(); 82 } 83 }
-------------------------双向链表
1 //双向链表 2 class LinkedList { 3 private Node head; 4 private Node tail; 5 /** 6 * 定义构造方法,初始化头结点和尾结点。 7 */ 8 public LinkedList() { 9 head = new Node("Head"); 10 tail = new Node("Tail"); 11 head.next = tail; 12 tail.prev = head; 13 } 14 /** 15 * 定义结点类 16 */ 17 class Node { 18 private String data; 19 private Node prev; 20 private Node next; 21 public Node(String data) { 22 this.data = data; 23 this.prev = this.next = null; 24 } 25 } 26 /** 27 * 从头结点插入,每次都是在头结点之后插入 28 * 29 * @param data 30 * 结点数据 31 */ 32 public void addFirst(String data) { 33 Node n = new Node(data); 34 n.prev = head; 35 n.next = head.next; 36 head.next = n; 37 n.next.prev = n; 38 } 39 /** 40 * 从尾结点插入 41 * 42 * @param data 43 * 结点数据 44 */ 45 public void addTail(String data) { 46 Node n = new Node(data); 47 n.next = tail; 48 n.prev = tail.prev; 49 tail.prev = n; 50 n.prev.next = n; 51 } 52 /** 53 * 得到链表的size 54 * @return int 链表的size 55 */ 56 public int size() { 57 Node p = head.next; 58 int count = 0; 59 while (true) { 60 if (p.next == null) { 61 break; 62 } 63 p = p.next; 64 count++; 65 } 66 return count; 67 } 68 /** 69 * 得到指定位置的数据 70 * @param index int 索引 71 * @return String 指定索引处的数据 72 */ 73 public String get(int index) { 74 if (index >= this.size() || index < 0) { 75 throw new IndexOutOfBoundsException("下标越界"); 76 } 77 Node p = head.next; 78 for (int i = 0; i < index; i++) { 79 p = p.next; 80 } 81 return p.data; 82 } 83 } 84 // 双向循环链表 85 class DoubleLinkedList { 86 // 定义头结点 87 private Node head; 88 private int length; 89 public DoubleLinkedList() { 90 this.head = null; 91 this.length = 0; 92 } 93 class Node { 94 private String data; 95 private Node prev; 96 private Node next; 97 public Node(String data) { 98 this.data = data; 99 this.prev = this.next = this; 100 } 101 } 102 // 顺序添加到链表 103 public void add(String data) { 104 // 实例化节点 105 Node n = new Node(data); 106 // 得到最后一个节点 107 Node last = getLast(); 108 if (last == null) { 109 head = n; 110 } else { 111 // 总共修改四个值,最后一个节点的next,新加节点的prev和next,头结点的prev 112 last.next = n; 113 n.prev = last; 114 n.next = head; 115 head.prev = n; 116 } 117 this.length++; 118 } 119 public Node getLast() { 120 if (this.length == 0) { 121 return null; 122 } 123 return head.prev; 124 } 125 public int size() { 126 return this.length; 127 } 128 public String get(int index) { 129 Node n = head; 130 if (index < 0 || index > length - 1) { 131 throw new IndexOutOfBoundsException("下标越界"); 132 } 133 for (int i = 0; i < index; i++) { 134 n = n.next; 135 } 136 return n.data; 137 } 138 } 139 public class Demo4 { 140 public static void main(String[] args) { 141 DoubleLinkedList dll = new DoubleLinkedList(); 142 dll.add("lala"); 143 dll.add("hehe"); 144 dll.add("jaja"); 145 dll.add("fafa"); 146 System.out.println(dll.size()); 147 for (int i = 0; i < dll.size(); i++) { 148 System.out.print(dll.get(i) + " "); 149 } 150 System.out.println(); 151 LinkedList ll = new LinkedList(); 152 ll.addFirst("11");// 首插入 153 ll.addFirst("22");// 首插入,然后"11"后移 154 ll.addTail("33");// 尾插入 155 ll.addTail("44");// 尾插入,"33"前移 156 System.out.println(ll.size()); 157 for (int i = 0; i < ll.size(); i++) { 158 System.out.print(ll.get(i) + " "); 159 } 160 } 161 }
------------------------------树的Map实现
1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 /** 6 * 利用Map实现树型结构 1.能获得子节点 2.能获取父节点 3.能获取兄弟节点 4.能获取祖先节点 5.能获取子孙节点 7 */ 8 class MyTree { 9 private Map<String, String> map;// 基础Map 10 private Map<String, List<String>> map2;// 为了查找子节点方便创造的Map 11 public MyTree() { 12 this.map = new HashMap<String, String>(); 13 this.map2 = new HashMap<String, List<String>>(); 14 } 15 /** 16 * 添加数据到Map中 17 * 18 * @param child 19 * 子节点 20 * @param parent 21 * 父节点 22 */ 23 public void add(String child, String parent) { 24 this.map.put(child, parent); 25 List<String> list = this.map2.get(parent); 26 if (list == null) {// 如果list为空,说明map2没有parent这个key值 27 list = new ArrayList<String>(); 28 this.map2.put(parent, list); 29 } 30 list.add(child); 31 } 32 /** 33 * 通过传递child,得到map中的元素 34 * 35 * @param child 36 * 子节点 37 * @return 父节点 38 */ 39 public String getParent(String child) { 40 return this.map.get(child); 41 } 42 /** 43 * 通过传递过来的父节点,得到map2中的子节点集合 44 * 45 * @param parent 46 * 父节点 47 * @return 子节点集合 48 */ 49 public List<String> getChild(String parent) { 50 return this.map2.get(parent); 51 } 52 /** 53 * 通过传递的节点,先找到该节点的父节点,然后找到父节点的所有子节点集合,最后在集合中remove该节点 54 * @param node 节点 55 * @return 兄弟节点集合 56 */ 57 public List<String> getBrother(String node) { 58 if("root".equals(node)) return null; 59 String parent = this.getParent(node); 60 List<String> node2 = new ArrayList<String>(); 61 node2.add(node); 62 List<String> child = this.getChild(parent); 63 List<String> brother = new ArrayList<String>(child); 64 brother.removeAll(node2); 65 return brother; 66 } 67 /** 68 * 通过传递过来的子节点,迭代查找父节点,得到这个子节点的所有祖先集合 69 * 70 * @param child 71 * 子节点 72 * @return 祖先集合 73 */ 74 public List<String> getAncestor(String child) { 75 // ancestor 祖先 76 List<String> list = new ArrayList<String>(); 77 String parent = getParent(child); 78 if (parent == null) { 79 return list; 80 } 81 list = getAncestor(parent); 82 list.add(parent); 83 return list; 84 } 85 /** 86 * 通过传递过来的父节点,迭代查找子节点,构成子节点集合 87 * 88 * @param parent 89 * 父节点 90 * @return 子孙节点集合 91 */ 92 public List<String> getDescendant(String parent) { 93 // descendant 子孙,后裔 94 List<String> list = new ArrayList<String>(); 95 List<String> child = getChild(parent); 96 if (child == null) 97 return list; 98 for (int i = 0; i < child.size(); i++) { 99 List<String> temp = getDescendant(child.get(i)); 100 list.add(child.get(i)); 101 list.addAll(temp); 102 } 103 return list; 104 } 105 } 106 public class Demo02 { 107 public static void main(String[] args) { 108 MyTree mt = new MyTree(); 109 mt.add("互联网", "root"); 110 mt.add("百度", "互联网"); 111 mt.add("阿里巴巴", "互联网"); 112 mt.add("腾讯", "互联网"); 113 mt.add("百度一下", "百度"); 114 mt.add("百度糯米", "百度"); 115 mt.add("百度云", "百度"); 116 mt.add("淘宝", "阿里巴巴"); 117 mt.add("天猫", "阿里巴巴"); 118 mt.add("支付宝", "阿里巴巴"); 119 mt.add("QQ", "腾讯"); 120 mt.add("微信", "腾讯"); 121 mt.add("腾讯游戏", "腾讯"); 122 mt.add("云PC", "百度云"); 123 mt.add("云手机", "百度云"); 124 mt.add("余额宝", "支付宝"); 125 mt.add("天弘基金", "支付宝"); 126 mt.add("CF", "腾讯游戏"); 127 mt.add("毒奶粉", "腾讯游戏"); 128 mt.add("警察", "CF"); 129 mt.add("匪徒", "CF"); 130 mt.add("暴风骑兵", "毒奶粉"); 131 mt.add("黑暗帝君", "毒奶粉"); 132 mt.add("剑皇", "毒奶粉"); 133 mt.add("铿锵玫瑰", "毒奶粉"); 134 mt.add("复仇者", "毒奶粉"); 135 System.out.println("得到毒奶粉的父节点:"); 136 System.out.println(mt.getParent("毒奶粉")); 137 System.out.println("----------------------------"); 138 System.out.println("得到毒奶粉的子节点:"); 139 List<String> list = mt.getChild("毒奶粉"); 140 for (String string : list) { 141 System.out.println(string); 142 } 143 System.out.println("----------------------------"); 144 145 System.out.println("得到毒奶粉的兄弟:"); 146 List<String> list2 = mt.getBrother("毒奶粉"); 147 for (String string : list2) { 148 System.out.println(string); 149 } 150 System.out.println("----------------------------"); 151 System.out.println("得到毒奶粉的祖先:"); 152 List<String> list3 = mt.getAncestor("毒奶粉"); 153 for (String string : list3) { 154 System.out.println(string); 155 } 156 System.out.println("----------------------------"); 157 String str = "腾讯"; 158 System.out.println("得到" + str + "的子孙:"); 159 // 首先得到节点的所有子孙节点 160 List<String> list4 = mt.getDescendant(str); 161 // 得到该节点的祖先深度 162 int length = mt.getAncestor(str).size(); 163 for (String string : list4) { 164 // 得到每一个节点的祖先深度,然后减去起始节点的祖先深度,for循环输出--。构成树型结构 165 List<String> temp = mt.getAncestor(string); 166 for (int i = 0; i < temp.size() - length; i++) { 167 System.out.print("--"); 168 } 169 System.out.println(string); 170 } 171 System.out.println("----------------------------"); 172 } 173 }
----------------------------------