数据结结构之链表
按线性的顺序存储数据,而是在每一个节点里存下一个节点的指针(Pointer)
链表与数组区别
链表不适合遍历,但是适合灵活的(插入,删除等)操作
递归算法:直接或间接调用自身的算法
注:递归一定要有出口,递归过多会造成栈内存溢出(当N很大时)
public class test_13
{
public static void main(String[] args)
{
System.out.println(jieceng(5));
System.out.println(jieceng_dg(5));
}
//求阶层
public static int jieceng(int num)
{
int sum = num;
int i = num -1;
do
{
sum = sum*i;
i--;
}while(i>1);
return sum;
}
// 递归算法 ,节俭了代码
// 递归一定要有出口,递归过多会造成栈内存溢出
public static int jieceng_dg(int num)
{
if (num==1)
return 1;
return num*jieceng_dg(num-1);
}
}
完整链表代码:
// 链表数据结构
// 适合用于频繁进行添加、插入、删除操作
public class test_13_lianbiao
{
public static void main(String[] args)
{
NodeManager nm = new NodeManager();
nm.addNode("1");
nm.addNode("2");
nm.addNode("3");
nm.addNode("4");
nm.addNode("5");
nm.addNode("6");
nm.printNode();
nm.delNode("4");
nm.printNode();
}
}
//链表的节点管理类
class NodeManager
{
private Node head;//头节点(根节点)
public void addNode(String name)
{
if (head==null)
{
head = new Node(name);
}
else
{
head.add(name);
}
}
public void delNode(String name)
{
if (head.getName().equals(name))
{
head=head.next;
}
else
{
head.delet(name);
}
}
public void printNode()
{
if (head!=null)
{
System.out.print(head.getName()+"->");
head.print();
System.out.println();
}
}
// 表示每个节点对象
class Node
{
private String name;
private Node next;// 表示当前结点的下一个节点
public String getName()
{
return name;
}
public Node(String name)
{
this.name=name;
}
public void add(String name)//添加节点
{
if(this.next==null)
{
this.next = new Node(name);
}
else
{
this.next.add(name);//体现出递归调用
}
}
public void delet(String name)//删除节点
{
if (this.next!=null)
{
if (this.next.name.equals(name))
{
this.next=this.next.next;
}
else
{
this.next.delet(name);
}
}
}
public void print()// 打印所有节点
{
if (this.next!=null)
{
System.out.print(this.next.getName()+"->");
this.next.print();
}
}
}
}
跑出结果: