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