一、单链表
1.结点定义
public class ListNode {
int data;
ListNode next;
ListNode (int data){
this.data=data;
}
}
2.建立链表
//头插法建立链表:链表顺序和输入顺序相反
public ListNode createList1(){
ListNode L=null,s;
Scanner scanner=new Scanner(System.in);
int x=scanner.nextInt();
while (x!=999){
s=new ListNode(x);
s.next=L;
L=s;
x=scanner.nextInt();
}
return L;
}
//尾插法建立链表:链表顺序和输入顺序一致
public ListNode createList2() {
ListNode L=null , s, r=null;
boolean isHead=true;
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
while (x != 999) {
s=new ListNode(x);
if(isHead){
L=r=s;
isHead=false;
}else {
r.next=s;
r=s;
}
x=scanner.nextInt();
}
r.next=null;
return L;
}
3.查找
/**
* 查找链表L中第i个结点
* @param L 链表
* @param i from 0
* @return 第i个结点,查找失败返回null
*/
ListNode getElem(ListNode L,int i){
ListNode p=L;
int j=0;
if(i<0) return null;
while (j<i){
if(p!=null){
p=p.next;
j++;
}else {
//i>链表长度
return null;
}
}
return p;
}
/**
* 查找值为e的结点的位置
* @param L 单链表
* @param e 给定值
* @return from 0,查找失败返回-1
*/
int getIndex(ListNode L,int e){
ListNode p=L;
int i=0;
while (p!=null&&p.data!=e){
p=p.next;
i++;
}
if(p==null)return -1;
else return i;
}
4.插入
//值为x的结点插到链表第i个位置
s=new ListNode(x);
p=getElem(L,i-1);
s.next=p.next;
p.next=s;
5.删除
//将单链表的第i个结点删除
p=getElem(L,i-1);
q=p.next;
p.next=q.next;
q=null;
二、栈和队列
栈和队列的初始化和使用见二叉树先序遍历和层次遍历代码。
三、二叉树
1.二叉树节点的定义
public class BiTNode {
int data;
BiTNode left;
BiTNode right;
public BiTNode(int data) {
this.data = data;
}
}
2.相关算法
public class BiTree {
//打印结点,相当于访问结点
public void print(BiTNode node){
System.out.print(node.data+" ");
}
/**
* 递归先序遍历
* @param T 根结点
*/
public void preOrder(BiTNode T){
if(T!=null){
print(T);
preOrder(T.left);
preOrder(T.right);
}
}
/**
* 递归中序遍历
* @param T 根结点
*/
public void inOrder