单向链表
单链表的创建和遍历
在学习链表之前,我还一直在想,数组在内存中是连续的,但是链表不连续,怎么去实现呢?我们难道还能像创建一个数组一样去创建一个叫做“链表”的数据结构?
原来链表是通过创建节点对象来实现的,在节点对象中存放目标数据和下一个对象的内存地址。相当于在队列中需要有一个数组来存放数据一样。
有个问题容易搞混,就是存放的下一个对象的地址,因为对象就是靠地址来区分的,所以地址就可以表示该地址所指向的对象。思考一下就能知道,最后一个有效元素的下一个地址为null,则说明最后元素的后一个元素是null,即已经没有有效数据了。
事实上,只要不给next赋值,它默认就是null。head.getNext()即是当前元素的属性值,也代表着下一个元素。
单向链表的创建、向末尾添加数据和遍历,代码如下:
public class OnewayLinkedListDemo {
public static void main(String[] args) {
OnewayLinkedList onewayLinkedList = new OnewayLinkedList();
onewayLinkedList.show();
System.out.println("------------------------------");
Person p1 = new Person("宋江", 30);
onewayLinkedList.addPerson(p1);
onewayLinkedList.show();
System.out.println("------------------------------");
Person p2 = new Person("燕青", 24);
onewayLinkedList.addPerson(p2);
onewayLinkedList.show();
System.out.println("------------------------------");
Person p3 = new Person("吴用", 28);
onewayLinkedList.addPerson(p3);
onewayLinkedList.show();
System.out.println("------------------------------");
Person p4 = new Person("武松", 27);
onewayLinkedList.addPerson(p4);
onewayLinkedList.show();
}
}
class OnewayLinkedList {
// 先初始化一个头节点,后续不要动这个节点,不然容易乱套
Person head = new Person("", 0);
// 直接将数据添加到尾部
public void addPerson(Person person) {
// 这里因为不能动头节点,所以需要使用一个中间变量
// temp一开始指向的是头节点
Person temp = head;
// 从头开始遍历,直到找到链表的末尾
while (true) {
if (temp.getNext() == null) {
break;
}
// 如果还没到末尾,就把temp指针后移
temp = temp.getNext();
}
// 循环一