单向链表

简介: 在做缓存设计的时候,可以用到链表的数据结构来做缓存设计。主体结构采用map,而存储的节点、数据采用双向链表。这里介绍单向链表,因为如果搞懂了单向链表,其实双向链表更好理解。数据结构中的链表分为单向链表、双向链表、循环链表。单向链表的数据结构中通常会存在数据域和节点域:如图1:单向链表的数据结构

在做缓存设计的时候,可以用到链表的数据结构来做缓存设计。主体结构采用map,而存储的节点、数据采用双向链表。这里介绍单向链表,因为如果搞懂了单向链表,其实双向链表更好理解。

数据结构中的链表分为单向链表、双向链表、循环链表。单向链表的数据结构中通常会存在数据域和节点域:

如图1:单向链表的数据结构

publicclassLinkNode{
intvalue; // 数据域LinkNodenext; // 节点域,相当于c和c++中的指针}

微信图片_20221214031259.png

图1 链表的数据和节点

如图2:单向链表中有头节点和尾节点,同时可以看到节点中都是只有一个next的指针指向下一个节点。同时可以看到tail节点指向null。

微信图片_20221214031302.png


双向链表:存在前驱节点和后继节点,基于前驱和后继节点可以很方便的表示节点元素间的关系。可以看到与单向链表不同的是存在的节点有前驱节点,同时是双向的。

微信图片_20221214031305.png


LeetCode206题:单向链表的反转(如:(1->2->3->4)反转成(4->3->2->1)

微信图片_20221214031307.png


在遍历链表时,首先将当前节点的下一个节点指向前驱节点,此时需要将当前节点的前节点变成当前节点,然后将当前节点变成下一个节点即可实现替换的关系,也即是一个从后往前的过程

实现过程:

publicstaticLinkNodereverse(LinkNodehead){
while(head!=null){
LinkNodecurr=head;
LinkNodeprev=null;
// 如果当前节点不为空,则首先设置空节点,将当前节点的下一个节点指向前节点,同时前节点指向当前节点,当前节点指向next节点while(curr!=null){
LinkedNodenext=curr.next;
curr.next=prev;
prev=curr;
curr=next;
     }
returnprev;
  }
}

单向链表去重(如:1->2->2->3->3->4)->去重后的效果:(1->4)

微信图片_20221214031311.png


考虑单向链表中

一种情况:当前节点只有一个节点或者当前的节点与下一个节点不同时,此时进行节点指向。
一种情况:当前的节点的下一个节点域当前节点相同,此时需要进行去重处理,去重的过程就是一个节点指向修改的过程。

实现过程:

publicstaticLinkNodedumpRemoveLinkList(LinkNodehead){
while(head!=null){
LinkNodedummy=newLinkNode();
LinkNodetail=dummy;
// 考虑单个元素和不相等情况if(head.next==null||head.value!=head.next.value){
tail.next=head;
tail=head;
        }
// 考虑相同情况,进行去重if(head.next!=null&&head.value==head.next.value){
head=head.next; 
      }
// 拿到不同的数据的下一个数据的首个元素的节点head=head.next;
    }
tail.next=null;
returndummy.next;
}


了解了它的数据结构,前面我说到可以用在缓存上,下一篇我们来看它的使用场景。


目录
相关文章
|
1月前
【数据结构】单链表之--无头单向非循环链表
【数据结构】单链表之--无头单向非循环链表
|
6月前
|
存储 算法 C语言
【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)
一、链表的概念 二、特点 三、链表的分类 四、单向链表的结构体 命名规范: 二级指针 ❗️注意事项 五、函数实现 1.单链表的打印
【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)
|
7月前
|
Java
面试题-手写一个单向链表
面试题-手写一个单向链表
34 0
|
2月前
|
存储
数据结构 模拟实现LinkedList单向不循环链表
数据结构 模拟实现LinkedList单向不循环链表
32 0
|
2月前
|
存储 Python
如何在Python中实现单向链表和双向链表?
如何在Python中实现单向链表和双向链表?
|
3月前
|
缓存 算法 Java
6.单向链表正确实现方式
6.单向链表正确实现方式
41 1
|
3月前
|
存储 程序员 C语言
链表篇---单向链表的C语言实现
链表篇---单向链表的C语言实现
|
3月前
|
存储 缓存 算法
Algorithms_基础数据结构(02)_线性表之链表_单向链表
Algorithms_基础数据结构(02)_线性表之链表_单向链表
38 0
|
4月前
|
存储 C语言
链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)
在上一篇文章中,我们探索了顺序表这一基础的数据结构,它提供了一种有序存储数据的方法,使得数据的访 问和操作变得更加高效。想要进一步了解,大家可以移步于上一篇文章:探索顺序表:数据结构中的秩序之美 今天,我们将进一步深入,探讨另一个重要的数据结构——链表 链表和顺序表一样,都属于线性表,也用于存储数据,但其内部结构和操作方式有着明显的不同。通过C语言的具体实现,我们将会更加直观地理解它
108 1
链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)
|
4月前
|
存储
队列的学习(一)用数组和链表实现单向队列
队列的学习(一)用数组和链表实现单向队列 队列(Queue)是一种先进先出的数据结构,类似于现实生活中排队的场景。它有两个基本操作:入队(enqueue)和出队(dequeue)。在本文中,我们将介绍如何使用数组和链表来实现单向队列。