热情的熊二  

 

 链表定义形式:

  struct note

    {

            int data;         /*数据成员可以是多个不同类型的数据*/

            struct note *next; /*指针变量成员只能是一个*/

    };

每个结点的数据可用一个结构体表示,该结构体由两部分成员组成:数据成员与结构指针变量成员。

链表的长度是动态的,当需要建立一个结点,就向系统申请动态分配一个存储空间,如此不断地有新结点产生,直到结构指针变量指向为空(NULL)。

申请动态分配一个存储空间的表示形式为: (struct note*) malloc(sizeof(struct note))

链表的建立:在链表建立过程中,首先要建立第一个结点,然后不断地在其尾部增加新结点,直到不需再有新结点,即尾指针指向NULL为止。

 

设有结构指针变量 struct note *p,*p1,*head;

Head:用来标志链表头;

P:在链表建立过程中,p总是不断先接受系统动态分配的新结点地址。

p1->next:存储新结点的地址。

 

双向链表在插入、删除、查找方面时间复杂度更小,更有优势。

如何基于链表实现最近最少使用策略 LRU(Least Recently Used)缓存淘汰算法?

我们维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。

当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。

1. 如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。

2. 如果此数据没有在缓存链表中,又可以分为两种情况:

如果此时缓存未满,则将此结点直接插入到链表的头部;

如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。

 

将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。

p->next=q。这行代码是说,p 结点中的 next 指针存储了 q 结点的内存地址。

p->next=p->next->next。这行代码表示,p 结点的 next 指针存储了 p 结点的下下一个结点的内存地址。

 

注意:

插入结点时,一定要注意操作的顺序,防止内存泄漏

删除链表结点时,也一定要记得手动释放内存空间

用带头结点的链表能够规避:空链表的插入(p=new_node)和链表最后一个节点的删除(p=null),需单独处理

 

posted on 2020-07-28 09:21  热情的熊二  阅读(238)  评论(0)    收藏  举报