链表(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-> */