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

转自: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)时间删除该结点

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

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

原文地址:https://www.cnblogs.com/BlueBlueSea/p/9632502.html