• 数据结构之链表面试[转载]


    转自:https://www.cnblogs.com/nnngu/p/8264766.html

    1.从尾到头打印单链表

    利用栈,压栈就行了呗,先进后出。

    //我一开始居然都没想到,是有多菜?

    2.在单链表中查找倒数第k个节点。

    ①直接遍历,得出链表的长度,直接输出就好。

    //这个想到了,遍历的时候就直接push进向量里就好了,再输出第k个。

    but!!!不让遍历整个链表的长度怎么办?那我用向量其实也可以完成的,那就直接每次判断向量的长度,但是这样好像不太好啊。。。。不专业啊。

     ②需要用到两个节点型的变量,首先让fisrt和second都指向同一个节点,然后让second节点往后移动k-1个节点;然后!整体移动这两个节点,直到second节点指向最后一个,那么first节点就是倒数第K个节点的位置。复杂度为O(n)。

    //厉害啊,从来没见过这样的思路。

     3.反转一个单向链表。

     //关键就是怎么在单链表中找到它的前一个节点,不能每次都去遍历啊。如果空间允许的话,可以再重新建一个链表。

    遍历链表,在遍历的时候,将当前遍历到的点都作为头节点,那么遍历到下一个点的时候,下一个节点的next就指向头节点,然后头节点再只想自己,这样循环就可以了。

    //还有一个小小地注意点,就是如果链表只有一个头节点,那么不用反转。

    (2020-12-29更新————感觉自己以前写的真的好弱智!!!)

    4.找出两个单链表相交的第一个公公节点

    ①可以使用两个栈,将所有元素放入栈中,分别弹出栈顶元素,最后一个相同的元素就是一个公共节点。

    快慢指针,首先遍历他们得到两个链表的长度,再在较长的链表上走|len1-len2|部,那么第一个相同的节点就是它们的第一个公共节点。

    //确实是第二种方法比较好,虽然时间复杂度也是O(len1+len2),但是节约了空间。

    5.如何判断单链表是否存在环的三种判断方法

    ①遍历看是否有遍历过的,将遍历过的点用某个数据结构存储起来,每次遍历都再去查找这个是否出现过,这是最垃圾的方法了。

    //这个一想真的复杂度是很高很高的。

    ②使用hash表,hash中存的是节点的内存地址,这样查找的复杂度为O(1),遍历需要O(n)。

    //但是我感觉这样还是比较复杂的

    快慢指针:一个快指针pfast每次移动两个节点,慢指针pslow每次移动一个节点,如果快指针能够追上慢指针,那么存在环

    //比方法1要好,因为方法1中啊还存在存储起来, 然后每次查找的过程,实在是慢。

    6.给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

    这个我想到的还是遍历,因为是需要得到当前删除节点的前一个节点,那样肯定不能保证复杂度。

    给的答案是,因为当前要删除的结点指针的下一个节点是容易得到的,那么就先得到下一个节点,将下一个节点的值赋值给当前,并且删除下一个节点即可!

  • 相关阅读:
    Fortify Audit Workbench Cookie Security: Cookie not Sent Over SSL
    Fortify Audit Workbench 笔记 Access Control: Database
    MATLAB中的polyfit函数的使用方法
    编写python代码时出现SyntaxError: invalid character in identifier的解决方法
    Windows10安装MinGW-W64出现Cannot download repository.txt的一种解决方法
    使用IDM下载B站视频出现声音跟视频分离的一种解决方法
    简洁桌面(使用Windows自带的桌面整理功能)
    MATLAB标记图像中特殊的点
    解决python使用pip安装下载库出现错误:ERROR:Cannot unpack file xxxx情况
    解决python使用pip下载安装库速度慢问题
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9632502.html
Copyright © 2020-2023  润新知