
面试专题——链表
文章平均质量分 72
huangxy10
这个作者很懒,什么都没留下…
展开
-
1,单链表反转
题目:顾名思义,就是反转一个单链表。 思路1:重新开辟内存,简历一个新链表,然后从后面往前面复制。由于单链表无法很容易得到当前节点前面的节点,所以,复制每一个节点都得从前往后找到该节点,单个节点复制的时间复杂度为O(n),整个复杂度则为O(n^2),空间复杂度为O(n)。不可取。 思路2:不开辟新内存,采用交换节点内容的方式。前后两个指针,相互交换内容,之后原创 2012-09-23 22:36:40 · 1930 阅读 · 0 评论 -
9.判断两个单链表是否相交
只介绍O(n)算法思路1:将链表1中各结点地址存入HashTable中,再遍历链表2,如果有结点已经在HashTable中,则两链表相交。思路2:将链表1的尾结点和链表2的首结点(注意不是头结点)相连。再判断是否有环,如果有则两链表相交。思路3:(最简单的方法)判断两链表的尾结点是否为同一结点,若是,则相交。 实现部分为思路2。// Li原创 2012-09-24 19:50:58 · 1475 阅读 · 0 评论 -
8.判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?
判断单链表是否有环?思路:快慢指针,快指针每次走两步,慢指针每次走一步。每次判断快指针是否到头了以及快慢指针是否指向同一元素。快指针走到头了,则没有环;如果快指针和慢指针指向同一个元素,则有环。 如何找到环的起始点?思路:如果有环,则快慢指针一定相遇在环上。将环从快慢指针相遇结点剪开,则变成了两个单链表相交的问题。设两个单链表的长度分别为N,M,用两个指原创 2012-09-24 19:30:56 · 2220 阅读 · 1 评论 -
7,单链表交换任意两个元素(不包括表头)
思路:有两种情况,相邻和不相邻。首先找两个节点的前驱,可以通过前驱来判断是否相邻。相邻则改变3个结点的next指针,不相邻则改变4个结点的next指针。 注意:要判断许多出错的情况,比如,结点不在表中,结点为空,表为空等。// LinkTable.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #in原创 2012-09-24 18:40:48 · 4650 阅读 · 0 评论 -
链表题目汇总
单链表目录1.单链表反转2.找出单链表的倒数第4个元素3.找出单链表的中间元素4.删除无头单链表的一个节点5.两个不交叉的有序链表的合并6.有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表称一级单链表。7.单链表交换任意两个元素(不包括表头)8.判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?9.判断两个单链原创 2012-09-23 21:32:07 · 2954 阅读 · 0 评论 -
12.单链表排序
思路1:将链表中的数据存入数组中,使用数组进行排序,排好后再存入链表中。当然这并不是这题所要考察的。但是在实际应用中却相当有价值。因为链表中的排序算法都比较慢,进行转存再排序也是一种很好的方法。思路2:排序算法有1, 插入排序:简单插入排序,希尔排序2, 交换排序:冒泡排序, 快速排序3, 选择排序:简单选择排序,堆排序4原创 2012-09-24 23:45:29 · 2291 阅读 · 1 评论 -
13.删除单链表中重复的元素
思路:使用哈希表。从头扫描,将出现过的节点存入哈希表中。如果元素已经在哈希表中出现过则删除,没有则存入。注意:删除时需要知道前一节点。我使用的链表中存储的是char型变量,所以哈希表即为含有256个元素的数组。如果存储的是其他数据类型,则可以使用stl中的hash_set容器。// LinkTable.cpp : 定义控制台应用程序的入口点。原创 2012-09-24 21:22:47 · 3330 阅读 · 0 评论 -
11.用链表模拟大整数加法运算
例如:9->9->9->NULL+ 1->NULL 1->0->0->0->NULL思路:使用递归,能够实现从前往后计算。// LinkTable.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace s原创 2012-09-24 20:58:31 · 3207 阅读 · 0 评论 -
5,两个不交叉的有序链表的合并
思路:比较大小,控制指针指向,如果一个链表已经结束,则把剩下的链表加上去即可。注意:要判断输入时候正确。两个链表是否为空链表等特殊情况。如果交叉了怎么办。后面会介绍。// LinkTable.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespa原创 2012-09-24 00:20:15 · 2139 阅读 · 0 评论 -
4,常数时间内删除单链表中某结点
问题:一个单链表,很长,遍历一遍很慢,我们仅知道一个指向某节点的指针pNode,而我们又想删除这个节点。思路:将该结点的下一个结点的内容拷贝到当前结点,然后删除下一个结点。如果该结点时最后一个结点,则必须遍历一遍单链表,找到前面一个结点,然后删掉该结点。注意:虽然最后一种情况是线性复杂度的,但是总体上来看还是常数时间的。// LinkTa原创 2012-09-23 23:53:52 · 2065 阅读 · 3 评论 -
3,找出单链表的中间元素
问题:找出单链表的中间元素思路:快慢指针。快指针每次走两步,慢指针每次走1步。快指针走到头时,慢指针所指即为中间结点。如果结点个数N为偶数,则中间结点为第N/2个结点。// LinkTable.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespac原创 2012-09-23 23:28:50 · 1625 阅读 · 0 评论 -
2,找出单链表的倒数第4个元素
注意:无论采用什么思路,编程时都要考虑,链表结点个数不足4个的情况。思路1:先找到最后一个元素,然后再从头扫描一遍,判断该元素的之后的第三个结点是否是最后一个结点。O(4n)=O(n)。比较粗糙的方法。思路2:快慢指针。先让快指针先走4步,找到第四个结点。然后让快慢指针同时走,每次一步。当快指针走到最后一个结点时,慢指针指向倒数第4个元素。思路3:原创 2012-09-23 23:14:46 · 1563 阅读 · 0 评论 -
10.两个单链表相交,计算相交点
思路在8中有介绍分别计算两链表的长度,为M,N。让指向长链表的指针先走,让两链表等长,再两指针一起走,第一次相遇点即为相交点。如果把相交链表变成一个环,则环的第一个结点即为相交点。// LinkTable.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace st原创 2012-09-24 20:03:51 · 2198 阅读 · 0 评论