注:看面试题时,主要应该以学习为主,面试题有些基本上是我们编程时会遇上的问题,通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题,看完这篇面试题后,希望能对你有所帮助,另外题中有问题的地方可以在评论区指出,在这里谢谢您的观看。
笔试题一
输入一个长度为n的链表,设链表中的元素的值为ai,返回该链表中的倒数第k个节点,如果该链表长度小于k,请返回一个长度为0的链表。
例如输入{1,2,3,4,5}时,返回倒数第二个结点,对应链表结构如下图所示:
其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点数为4的结点) ,系统会打印后面两个结点来比较。
解决方案一
定一个指针p,让p从头结点开始移动n-k次(链表长度n为5,倒数结点k为2),如下图所示。
解决方案二
定两个指针p和q,p指向头结点H,q指向H+k-1个结点,两结点同时向右移动,
每次移动一个结点,直到移动到最后,p指向的结点就是倒数第二个结点
笔试题二
删除给出链表中的重复元素(链表中元素重小到大有序),使链表中元素都只出现一次
例如:给出1->1->2->3->5->3->2,得1->2->3->5。
解决方案一
创建一个哈希表,定一个指针,在链表中顺序移动,每次移动一个结点,每次移动得到的值,
在哈希表对应位置置1,如果对应位置已经置1的情况下,后面移动还遇到置1的情况,说明
结点重复删除结点就行了,如下图所示。
解决方案二
定两个指针p、q,p、q都指向头结点,步骤:
让q顺序移动,每次移动1结点,如果遇到q结点的值等于p结点
的值,则删除q结点,移动完后,让p顺序移动一个结点,q = p,重复步骤,直到p移动到队尾,
如图所示