算法 - 链表操作思想 && case

季将
• 阅读 1038

算法 - 链表操作题目套路 前面这一篇文章主要讲链表操作时候的实操解决方式,本文从本质讲解链表操作的元信息,学完后,再也不怕链表操作题目了。

1.链表的基本操作

链表的基本操作无外乎插入,删除,遍历

插入的化,要考虑到前驱节点和后继节点,记住下面的伪代码

nex = 当前节点.next
当前节点.next = 插入的指针
插入指针.next = tmp 

对于删除,是否会觉得需要备份一下next的指针,答案是不用,执行语句是先取右边的值存起来然后赋值给左边的,所以直接下面一句话即可

cur.next = cur.next.next

对于遍历,实际上是又迭代和递归的,另外又有前序和后序

cur =  head
while cur != null {
   print(cur)
   cur = cur.next
}

//前序
dfs(cur) {
    if cur == null return
    print(cur.val)
    return dfs(cur.next)
} 

2.链表的考点

链表的考点就只有对指针的修改和对指针的拼接,其中都需要对指针的前驱节点和后继节点进行保留,如果头节点不能首次确定,或者可能会改变,那么又需要一个虚拟头节点,链表的考点无外乎就这些。

下面我们来看两个题

删除链表中的重复元素

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/

public ListNode deleteDuplicates(ListNode head) {
    //递归版
        if (head == null || head.next == null) 
            return head;
        
        if (head.val == head.next.val) {
            while (head.next != null && head.next.val == head.val) 
                head = head.next;
            head = deleteDuplicates(head.next);
        } else {
            head.next = deleteDuplicates(head.next);
        }

        return head;
} 

判断是否为回文链表

https://leetcode-cn.com/problems/palindrome-linked-list/

public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null)return true;
        temp = head;
        return dfs(head);
}

public boolean dfs(ListNode head){
    if(head == null)return true;
    boolean res = dfs(head.next) && temp.val == head.val;
    temp = temp.next;
    return res;
}

总结,链表的题目,掌握号指针的操作,就会简单点了,对于递归写法也会简化很多代码
吴邪,小三爷,混迹于后台,大数据,人工智能领域的小菜鸟。
更多请关注
算法 - 链表操作思想 && case

点赞
收藏
评论区
推荐文章
22 22
4年前
【数据结构之链表】详细图文教你花样玩链表
【系列文章推荐阅读】0.提要钩玄文章已经介绍了链式存储结构,介绍了链式存储结构的最基本(简单)实现——单向链表。单向链表,顾名思义,它是单向的。因为单链表的每个结点只有一个数据域和一个指针域,而该指针域只存储了下一个结点的地址,所以我们只能通过某结点找到其直接后继结点,却不能通过某节点找到其直接前驱结点。此外,由于单链表到尾结点(链表的最后一
Easter79 Easter79
3年前
tbox链表list和list_entry的使用
TBOX中提供了各种列表操作:1.list:元素在内部维护的双向链表2.list\_entry:元素在外部维护的双向链表3.single\_list:元素在内部维护的单向链表4.single\_list\_entry:元素在外部维护的单向链表由于双链和单链的接口使用类似,这里主要就
Stella981 Stella981
3年前
Redis基本操作——队列 List(原理篇)
Redis基本操作——List(原理篇)  学习过数据结构的同学,一定对链表(LinkedList)十分的熟悉。相信我们自己也曾经使用过这种数据结构。  链表分为很多种:单向链表,双向链表,循环链表,块状链表\1(https://www.oschina.net/action/GoToLink?url
Wesley13 Wesley13
3年前
275,环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。如果 pos 是 1,则在该链表中没有环。说明:不允许修改给定的链表。示例1:输入:head3,2,0,4,pos
Wesley13 Wesley13
3年前
15.链地址法
同样是为了解决哈希表中索引重复问题的算法,基本思路为将哈希表中维护的数组改成存储链表的数组,将数据存在链表中。也可以用数组但是数组的插入和删除的效率较低,故采用链表。实现:链表的实现:/链结点,相当于是车厢/publicclassNode{//数据域publi
Wesley13 Wesley13
3年前
Java数据结构和算法(四)
日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要插入索引后面的所以元素全部后移一位。而本文会详细讲解链表,可以解决数组的部分问题,相比数组的大小不可更改,链表更加灵活,在学习LinkedList源码对链表有了一个大致的了解。ArrayList和Linked
Wesley13 Wesley13
3年前
Java源码解析之LinkedList源码剖析(基于JDK1.8)
    学过数据结构的都知道双端队列(链表),没学过的也没有关系,下面我先介绍一下双端队列(链表),为什么要介绍它了,因为LinkedList本质上就是一个双端队列(链表)。一. 双端队列(链表)的介绍1. 如下图:双端队列(链表)中单个节点对应的结构!(https://oscimg.oschina.net/oscn
Stella981 Stella981
3年前
LeetCode 142 环形链表 II python
题目描述给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。说明:不允许修改给定的链表。样例如果不是环,则输出None如果是环,则输出入口节点想法:通过ac141,知道慢节点循环的次数就是环的长度无环的情况不用考虑,直接返回No
菜园前端 菜园前端
2年前
什么是链表?
原文链接:什么是链表?链表是有序的数据结构,链表中的每个部分称为节点。可以首、尾、中间进行数据存取,链表的元素在内存中不必是连续的空间,每个节点通过next指针指向下一个节点。优点链表的添加和删除不会导致其余元素位移。缺点无法根据索引快速定位元素。数组和链
深度学习 深度学习
2个月前
链表栈实现指南:从基础到实践
一、简介和特点链表栈是一种使用链表实现的栈数据结构,遵循后进先出(LIFO)原则。本文实现的链表栈通过动态内存分配节点,避免了数组实现的固定大小限制。‌主要特点‌:1.动态大小:无需预先分配固定空间2.高效操作:入栈和出栈都是O(1)时间复杂度3.内存效率
深度学习 深度学习
1个月前
头插法实现的树结构:链表式多叉树实现指南
一、简介和特点头插法实现的树是一种使用子节点的多叉。本文实现的树类通过链表头插法高效管理子节点关系,适合需要频繁插入子节点的场景。‌主要特点‌:1.动态子节点管理:使用链表存储子节点1.高效插入:头插法实现O(1)的子节点插入1.泛型支持:模板类设计支持多