数据结构03:链表(2)

127 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

链表的结构

在上一篇链表介绍中,我们学习了链表的基本构成,并介绍了链表的基本构成——Node(节点) 。在本片中,我们将利用上一篇设计的Node(节点) 来设计链表。

链表的实现

链表与顺序表相比,最大的不同就在于:链表元素在内存中存储得更加零散,不要求元素在内存中必须相邻存储。而我们在使用链表时,只需要记录头节点的地址,然后不断使用Node(节点)next属性向后遍历就可以访问到链表中的所有的元素。

image.png

如图所示,我们使用链表时,需要创建一个“指针“为我们遍历链表的节点。只需要使用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()。观察代码我们就会发现,与头插法相比尾插法里面要多出一个循环。这两种插入方法的不同主要在于,头插法是直接将节点插入到头节点后面的,而尾插法是将新的节点插入到链表的末尾。

image.png

使用头插法需要先将新节点的next属性指向head的next节点,然后再将head的next属性指向到新节点就能完成插入。

使用尾插入时,只需要先确认到链表中的最后一个节点,然后将新节点作为后继添加即可。

小结

本章主要讲解了链表的基本构成,以及链表是怎么添加元素的。

天天学习,加速成长!

希望与各位一起变得越来越强!