LINK(带头结点和不带头结点)
功能:实现插入、删除、反转(三种思想)
class LinkNode<Type> {
Type data;
LinkNode<Type> next;
public LinkNode() {
next = null;
}
public LinkNode(Type data) {
this.data = data;
next = null;
}
}
class LinkList<Type> {
private LinkNode<Type> first = null;
public LinkList() {
}
public void insertNode(Type data) {
LinkNode<Type> node = new LinkNode<Type>(data);
if (first == null) {
first = node;
} else {
node.next = first;
first = node;
}
}
public void deleteNode(Type data) {
LinkNode<Type> tmp = first;
if (first == null)
return;
if (tmp.data == data)
first = tmp.next;
while (tmp.next != null) {
if (tmp.next.data == data) {
tmp.next = tmp.next.next;
return;// error mo return
}
tmp = tmp.next;
}
}
public void showList() {
LinkNode<Type> tmp = first;
while (tmp != null) {
System.out.print(tmp.data + " ");
tmp = tmp.next;
}
}
public void reverse1() {
LinkNode<Type> pre, cur, last;
if (first.next == null || first == null)
return;
cur = first;
pre = null;
while (cur != null) {
last = cur.next;
cur.next = pre;
pre = cur;
cur = last;
}
first = pre;
}
public void reverse2() {
LinkNode<Type> cur = first, last;
if (cur == null || cur.next == null)
return;
while (cur.next.next != null)
cur = cur.next;
last = cur.next;
cur.next = null;
reverse2();
last.next = cur;
first = last;
}
public void reverse3() {
LinkNode<Type> cur, last;
cur = first;
if (cur == null || cur.next == null)
return;
last = cur.next;
first = last;
reverse3();
last.next = cur;
cur.next = null;
}
}
class HLinkList<Type> {
LinkNode<Type> head = new LinkNode<Type>();
HLinkList() {
}
public void insetNode(Type data) {
LinkNode<Type> node = new LinkNode<Type>(data);
node.next = head.next;
head.next = node;
}
public void showList() {
LinkNode<Type> tmp;
tmp = head.next;
while (tmp != null) {
System.out.print(tmp.data + " ");
tmp = tmp.next;
}
}
public void deleteNode(Type data) {
LinkNode<Type> tmp = head;
while (tmp.next != null) {
if (tmp.next.data == data) {
tmp.next = tmp.next.next;
return;// error no return
}
tmp = tmp.next;
}
}
public void reverse1() {
LinkNode<Type> pre, cur, last;
cur = head.next;
pre = null;
while (cur != null) {
last = cur.next;
cur.next = pre;
pre = cur;
cur = last;
}
head.next = pre;
}
public void reverse2() {
LinkNode<Type> cur = head.next, last;
if (cur == null || cur.next == null)
return;
while (cur.next.next != null)
cur = cur.next;
last = cur.next;
cur.next = null;
reverse2();
last.next = cur;
head.next = last;
}
public void reverse3() {
LinkNode<Type> cur, last;
cur = head.next;
if (cur == null || cur.next == null)
return;
last = cur.next;
head.next = last;
reverse3();
last.next = cur;
cur.next = null;
}
}
public class Link {
public static void main(String[] args) {
// Random random = new Random(90);
// check
// LinkList<Integer> link = new LinkList<Integer>();
// for (int i = 0; i < 10; i++) {
// link.insertNode(random.nextInt() % 100);
// }
//
// link.showList();
// System.out.println();
//
// link.deleteNode(1);
// link.showList();
// System.out.println();
//
// link.reverse1();
// link.showList();
// System.out.println();
// check
// HLinkList<Integer> hlink = new HLinkList<Integer>();
// for (int i = 0; i < 10; i++)
// hlink.insetNode(random.nextInt() % 100);
//
// hlink.showList();
// System.out.println();
//
// hlink.deleteNode(-17);
// hlink.showList();
// System.out.println();
//
// hlink.reverse3();
// hlink.showList();
}
}
STACK(顺序栈和链式栈)
功能:压栈,出栈
//sequence
class SeqStack<Type> {
private Type[] data;
private int sp;
private int size;
public SeqStack(Type[] data) {
this.data = data;
sp = 0;
size = data.length;
}
public boolean isEmpty() {
return sp == 0;
}
public boolean isPull() {
return sp == size;
}
public Type pop() {
if (isEmpty())
return null;
sp--;
return this.data[sp];
}
public void push(Type data) {
if (isPull())
return;
this.data[sp] = data;
sp++;
}
}
// link
class LinkStack<Type> {
class LinkStackNode {
private Type data;
private LinkStackNode next;
public LinkStackNode(Type data) {
this.data = data;
next = null;
}
public LinkStackNode() {
next = null;
}
}
private LinkStackNode sp = new LinkStackNode();
public boolean isEmpty() {
return sp.next == null;
}
public Type pop() {
Type data;
if (isEmpty())
return null;
data = sp.next.data;
sp.next = sp.next.next;
return data;
}
public void push(Type data) {
LinkStackNode node = new LinkStackNode(data);
node.next = sp.next;
sp.next = node;
}
}
public class Stack {
public static void main(String[] args) {
}
}
QUEUE(顺序队列与链式队列)
功能:入队,出队。
class SequenceQueue<Type> {
Type[] data;
int front;
int rear;
int size;
public SequenceQueue(Type[] data) {
this.data = data;
front = 0;
rear = 0;
size = data.length;
}
private boolean isEmpty() {
return front == rear;
}
private boolean isPull() {
return (rear + 1) % size == front;
}
public void enQueue(Type data) {
if (isPull())
return;
this.data[rear] = data;
rear++;
rear %= size;
}
public Type deQueue() {
Type data;
if (isEmpty())
return null;
data = this.data[front];
front++;
front %= size;
return data;
}
}
class LinkQueue<Type> {
class LinkQueueNode {
Type data;
LinkQueueNode next;
public LinkQueueNode(Type data) {
this.data = data;
next = null;
}
public LinkQueueNode() {
next = null;
}
}
LinkQueueNode front;
LinkQueueNode rear;
private boolean isEmpty() {
return front == null;
}
public void enQueue(Type data) {
LinkQueueNode node = new LinkQueueNode(data);
if (front == null)
front = node;
else
rear.next = node;
rear = node;
}
public Type deQueue() {
Type data;
if (isEmpty())
return null;
data = front.data;
front = front.next;
return data;
}
}
public class Queue {
public static void main(String[] args) {
}
}
BINARYTREE
功能:三种遍历与广度、深度遍历。
class BinTreeNode<Type> {
Type data;
BinTreeNode<Type> left;
BinTreeNode<Type> right;
public BinTreeNode() {
left = null;
right = null;
}
public BinTreeNode(Type data) {
this.data = data;
left = null;
right = null;
}
}
interface NodeHandler<Type> {
void visit(BinTreeNode<Type> node);
}
class BinTree<Type> {
private BinTreeNode<Type> root;
private BinTreeNode<Type> createTree(int level) {
BinTreeNode<Type> root = new BinTreeNode<Type>();
if (level < 0)
return null;
root.left = createTree(level - 1);
root.right = createTree(level - 1);
return root;
}
private void traversePreOrder(BinTreeNode<Type> root,
NodeHandler<Type> handle) {
BinTreeNode<Type> left, right;
if (root == null)
return;
left = root.left;
right = root.right;
handle.visit(root);
traversePreOrder(left, handle);
traversePreOrder(right, handle);
}
private void traverseInOrder(BinTreeNode<Type> root,
NodeHandler<Type> handle) {
BinTreeNode<Type> left, right;
if (root == null)
return;
left = root.left;
right = root.right;
traversePreOrder(left, handle);
handle.visit(root);
traversePreOrder(right, handle);
}
private void traversePostOrder(BinTreeNode<Type> root,
NodeHandler<Type> handle) {
BinTreeNode<Type> left, right;
if (root == null)
return;
left = root.left;
right = root.right;
traversePreOrder(left, handle);
handle.visit(root);
traversePreOrder(right, handle);
}
private void traverseStack(BinTreeNode<Type> root, NodeHandler<Type> handle) {
LinkStack<BinTreeNode<Type>> stack = new LinkStack<BinTreeNode<Type>>();
BinTreeNode<Type> node;
stack.push(root);
while ((node = stack.pop()) != null) {
if (node.right != null)
stack.push(node.right);
if (node.left != null)
stack.push(node.left);
handle.visit(node);
}
}
private void traverseQueue(BinTreeNode<Type> root, NodeHandler<Type> handle) {
LinkQueue<BinTreeNode<Type>> queue = new LinkQueue<BinTreeNode<Type>>();
BinTreeNode<Type> node;
queue.enQueue(root);
while ((node = queue.deQueue()) != null) {
if (node.left != null)
queue.enQueue(node.left);
if (node.right != null)
queue.enQueue(node.right);
handle.visit(node);
}
}
public BinTree(int level) {
root = createTree(level);
}
public void PreOrder(NodeHandler<Type> handler) {
traversePreOrder(root, handler);
}
public void InOrder(NodeHandler<Type> handler) {
traverseInOrder(root, handler);
}
public void PostOrder(NodeHandler<Type> handler) {
traversePostOrder(root, handler);
}
public void StackOrder(NodeHandler<Type> handler) {
traverseStack(root, handler);
}
public void QueueOrder(NodeHandler<Type> handler) {
traverseQueue(root, handler);
}
}
public class BinaryTree {
public static void main(String[] args) {
}
}
TREE(普通树)
功能:前后两种遍历与广度深度遍历。
import java.util.Random;
class TreeNode<Type> {
Type data;
TreeNode<Type> child;
TreeNode<Type> sibling;
public TreeNode(Type data) {
this.data = data;
child = null;
sibling = null;
}
public TreeNode() {
child = null;
sibling = null;
}
}
interface NodeHandle<Type> {
void visit(TreeNode<Type> node);
}
class Tree<Type> {
private TreeNode<Type> root;
Tree(int level) {
root = createTree(level);
}
private TreeNode<Type> createTree(int level) {
TreeNode<Type> root = new TreeNode<Type>();
TreeNode<Type> child;
Random random = new Random();
int n = random.nextInt(3);
if (level < 0)
return null;
if (n == 0 || level == 0)
return root;
root.child = createTree(level - 1);
child = root.child;
for (int i = 0; i < n - 1; i++) {
child.sibling = createTree(level - 1);
if (child.sibling == null)
continue;
child = child.sibling;
}
return root;
}
private void traversePre(TreeNode<Type> root, NodeHandle<Type> handle) {
TreeNode<Type> node;
if (root == null)
return;
handle.visit(root);
node = root.child;
while (node != null) {
traversePre(node.child, handle);
node = node.sibling;
}
}
private void traversePost(TreeNode<Type> root, NodeHandle<Type> handle) {
TreeNode<Type> node;
if (root == null)
return;
node = root.child;
while (node != null) {
traversePost(node.child, handle);
node = node.sibling;
}
handle.visit(root);
}
private void traverseStack(TreeNode<Type> root, NodeHandle<Type> handle) {
LinkStack<TreeNode<Type>> stack = new LinkStack<TreeNode<Type>>();
TreeNode<Type> node, child;
stack.push(root);
while ((node = stack.pop()) != null) {
handle.visit(node);
child = node.child;
while (child != null) {
stack.push(child);
child = child.sibling;
}
}
}
private void traverseQueue(TreeNode<Type> root, NodeHandle<Type> handle) {
LinkQueue<TreeNode<Type>> stack = new LinkQueue<TreeNode<Type>>();
TreeNode<Type> node, child;
stack.enQueue(root);
while ((node = stack.deQueue()) != null) {
handle.visit(node);
child = node.child;
while (child != null) {
stack.enQueue(child);
child = child.sibling;
}
}
}
public void preOrder(NodeHandle<Type> handle) {
traversePre(root, handle);
}
public void postOrder(NodeHandle<Type> handle) {
traversePost(root, handle);
}
public void stackOrder(NodeHandle<Type> handle) {
traverseStack(root, handle);
}
public void queueOrder(NodeHandle<Type> handle) {
traverseQueue(root, handle);
}
}
public class tree {
public static void main(String[] args) {
}
}