19、数据结构之链表
链表(Linked List)一种常见的数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每个节点里存到是下一个节点的指针(Pointer)。
上面就是一个链表,这是一个只有一个链表的链表,左边大的区域储存链表里面的信息,右边小区域是指针,有null和指向下一个链表的指针。像下面这样:
我们再说一下这个链表:
按照百家姓前八个来说链表,我们知道,前八个是赵钱孙李,周吴郑王,我们从上面的图可以看到,它们的储存地址是不一样的,每一个数据与都不同,这就是链表,链表与数组不一样的地方就是数组是连续的一片区域,链表不需要。我们设定,头指针为61,可以看到,61的数据域就是赵,他的指针域是13,再看13,他的数据域是钱,指针域是25,接着看25,数据域是孙,指针域是1。最后排下来就是赵钱孙李周吴郑王了。
大家可以先看看给链表添加、显示全部的代码:
public class Demo1
{
public static void main(String[] args)
{
NodeManager nm = new NodeManager();
nm.add(5);
nm.add(4);
nm.add(3);
nm.add(2);
nm.add(1);
nm.print();
}
}
class NodeManager//这里创建一个链表
{
private Node root;//这个是根节点,就是一开始的节点,就是图一,第一个点,并且是再链表内使用的要私有化,下面也是一样
//下面就是内部类Node里面的方法了
public void add(int data)
{
if(root == null)//添加的时候,如果刚开始的根节点为空
{
root = new Node(data);
}
else//如果不为空,就用内部类来传,因为root类型是Node,Node是有next指针的
{
root.addNode(data);//调用完这个方法,就进入了Node的addNode方法
}
}
public void del(int data)
{
}
public void print()
{
if(root != null)//说明根节点有东西
{
System.out.print(root.getData() + "->");
root.printNode();//内部类调用
System.out.println();
}
}
public boolean find(int data)
{
return false;
}
public void update(int oldData, int newData)
{
}
public void insertNode(int index, int data)
{
}
private class Node//内部类,理解成根节点后面的节点吧
{
private int data;//这里建立的对象可以是int,也可以是其他对象
private Node next;//这个就是这个Node的下一个链表,next指的就是下一个,把当前类型作为属性。
/*好,表示我们已经知道怎么该表示了,但是我们该怎么操作这个链表呢?比如增删改查和插入等。那么这些方法应该是谁的呢?
应该是这个内部类的,提一个原则:谁拥有数据,谁提供方法。这样,Node里面有数据(data),如果Node不提供方法,外部是
不能访问的,就像是你要在家里关着门,别人是进不到家里面来的。*/
//下面是构造方法和get set方法
public Node(int data)
{
this.data = data;
}
public void setData(int data)
{
this.data = data;
}
public int getData()
{
return data;
}
//下面是增、删、输出、查询、修改、插入方法。这些方法只能是NodeManager来用,主函数不知道这些,这时候,就在NodeManager里也加上这些方法
public void addNode(int data)
{
//第一步,传进来参数时,首先要看一看this.next是不是等于空(这个this指的是root传进来的this)
if(this.next == null)
{
this.next = new Node(data);//后继有人
}
else//此时已经后继有人了
{
this.next.addNode(data);//这时候,说明后面还有对象,这样就用了一个递归,进入下一个addNode方法,进入下一个这个方法里面
}
}
public void delNode(int data)
{
}
public void printNode()
{
if(this.next != null)//下一个节点不等于空
{
System.out.print(this.next.data + "->");
this.next.printNode();
}
}
public boolean findNode(int data)
{
return false;
}
public void updateNode(int oldData, int newData)
{
}
public void insertNode(int index, int data)//index:要插入数据的位置
{
}
}
}
/*
结果:
5->4->3->2->1->
*/