持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情。
链表的结构
在上一篇链表介绍中,我们学习了链表的基本构成,并介绍了链表的基本构成——Node(节点) 。在本片中,我们将利用上一篇设计的Node(节点) 来设计链表。
链表的实现
链表与顺序表相比,最大的不同就在于:链表元素在内存中存储得更加零散,不要求元素在内存中必须相邻存储。而我们在使用链表时,只需要记录头节点的地址,然后不断使用Node(节点) 的next属性向后遍历就可以访问到链表中的所有的元素。
如图所示,我们使用链表时,需要创建一个“指针“为我们遍历链表的节点。只需要使用next属性将p节点不断后移,就能遍历到链表中的所有节点。
所以,链表中最基本的属性,就是head(头节点)。
public class List{
public Node head; // 头节点属性
public List(){
this.head = new Node(); // 初始化头节点
}
}
设计好基本的链表属性后,我们开始为链表添加方法。
插入方法的实现很简单,我们只需要在调用该方法时,新建一个Node(节点) 对象然后再让链表中的节点指向这个新节点就好了。
public void add(int value) // 头插法
{
Node newNode = new Node(value);
newNode.addNext(this.head.next);
this.head.addNext(newNode);
}
public void append(int value) // 尾插法
{
Node p = this.head;
while(p.next != null)
p = p.next;
p.addNode(new Node(value));
}
这里我们设计了两种插入方法,一个是头插法add()一个是尾插法append()。观察代码我们就会发现,与头插法相比尾插法里面要多出一个循环。这两种插入方法的不同主要在于,头插法是直接将节点插入到头节点后面的,而尾插法是将新的节点插入到链表的末尾。
使用头插法需要先将新节点的next属性指向head的next节点,然后再将head的next属性指向到新节点就能完成插入。
使用尾插入时,只需要先确认到链表中的最后一个节点,然后将新节点作为后继添加即可。
小结
本章主要讲解了链表的基本构成,以及链表是怎么添加元素的。
天天学习,加速成长!
希望与各位一起变得越来越强!