zoukankan      html  css  js  c++  java
  • 关于链表的几道经典例题

    一、单链表(Singly Linked List)

    链表的最基本形态。以下是几道单链表的经典例题,涉及链表的遍历以及增删查改等基本操作,十分适合初步熟悉链表这一数据结构。

    LeetCode 21. 合并两个有序链表

    大致题意:将两个升序链表合并为一个新的升序链表并返回。

    思路:设置两个指针指向这两个链表的开头,比较两个指针指向的元素的大小,哪个小就把哪个的值赋给新链表的新结点,然后这个指针后移一位,然后重复如上操作。

    需要注意的是一些细节问题:某些情况下,如果两个链表中,一个链表已经完成遍历,但另一个没有,那么只需把未完成遍历的链表的所有剩余结点按顺序添加给新链表就可以了。

    LeetCode 19.删除链表的倒数第 N 个结点

    大致题意:用一趟扫描删掉链表的倒数第n个结点

    思路:此题有意思。由于链表的长度显然是未知的,而我们用一个指针进行一趟扫描,显然不知道这个指针之后的结点的数量情况,只有已经遍历的结点的数量是已知的。所以我们只能从已经遍历的结点下手。

    设立两个指向链表头部的指针:temp指针用来遍历链表,pre指针先不动。统计temp遍历结点的个数。当temp指针遍历了n个结点之后,pre指针开始向后遍历。这样,当temp指针完成整个遍历的时候,pre指向的结点就是要删除的结点。

    当然实际操作的时候细节与以上描述略有不同。不过很容易处理。

    LeetCode 2.两数相加

    大致题意:给你两个链表(长度不一定相等),你来模拟加法运算(和小学的加法竖式运算原理一样,只不过是从左往右进位的方向),把运算的结果存储在一个新的链表里。

    思路:没啥思维含量,神烦的是大量的细节处理,如进位、不等长的两个链表、一些特殊情况等。慢慢打吧!

    链表有许多分类:单向链表,双向链表,有头节点的单向链表,没头节点的单向链表,有头节点的单向循环链表,没头节点的双向循环链表……看似种类繁多,其实都只是在单向链表基础上改动几行代码的变体。以下是一些其他链表的例题。

    二、双向链表(Doubly Linked List)

    洛谷 P1160 队列安排
    大致题意: 维护一个队列,对其进行增(往某个结点左侧或右侧插入新结点)、删(删除指定编号的结点)操作。

    思路:左右插入的操作,建立双向链表可以很方便地实现。而删除结点这个操作,如果我们从头遍历找指定编号的结点,那么就会TLE(40pts)。好在要查找的编号都是唯一且小于n(n最大为100000)的,这样,只要我们先定义一个指针数组a[n],在添加新结点的时候把这个结点(假如编号为k)的地址保存到a[k],那么如果到时候要删除k号结点,我们就可以直接通过a[k]找到k号结点,在(O(1))时间内删了它。

    此题细节也不少。这道题开个头节点可以使操作容易一些。

  • 相关阅读:
    ofbiz定时任务配置
    MySQL重置root密码
    谷歌默认最小字体解决方案
    CSS样式-文字在一行内显示不换行,超出部分用省略号(white-space、overflow、text-overflow、word-wrap、word-break)
    使用gulp自动化打包合并前端静态资源(CSS、JS文件压缩、添加版本号)
    JS判断两个日期是否为同一周
    AES、DES加解密方法(Java和JS编程)
    Nodejs代理解决开发环境下跨域问题
    js的垃圾收集机制以及写代码如何处理
    手机端黑屏时定时器无法执行
  • 原文地址:https://www.cnblogs.com/yige2019/p/15388846.html
Copyright © 2011-2022 走看看