链表算法解析

面试时链表解题的方法论

1)对于笔试,不用太在乎空间复杂度,一切为了时间复杂度

2)对于面试,时间复杂度依然放在第一位,但是一定要找到空间最省的方法

链表面试题常用数据结构和技巧

1)使用容器(哈希表、数组等)

2)快慢指针

给定一个单链表的头节点head,请判断该链表是否为回文结构。

1)哈希表方法特别简单(笔试用)

2)改原链表的方法就需要注意边界了(面试用)
解析:使用快慢指针,当快指针到终点时,取出慢指针的值,就是中点,然后将mid右边的数的指针都指向mid的方向,从首尾开始遍历
当遇到下一个Node没有值时停下,没有不相等的节点,就是符合回文结构的

将单向链表按某值划分成左边小、中间相等、右边大的形式

1)把链表放入数组里,在数组上做partition(笔试用)

2)分成小、中、大三部分,再把各个部分之间串起来(面试用)
解析:创造6个节点,分别分小头,小尾,等头,等尾,大头,大尾,
当有比x数小的数时,将小头和小尾都塞这个Node,再出现满足条件的数后,将小尾的下一个节点塞为此Node,小尾塞成此Node
等结束时,将小尾连中头,中尾连大头

给定一个由Node节点类型组成的无环单链表的头节点 head,请实现一个函数完成这个链表的复制,并返回复制的新链表的头节点。

一种特殊的单链表节点类描述如下
class Node {
int value;
Node next;
Node rand;
Node(int val) { value = val; }
}
rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节点,也可能指向null。
【要求】
时间复杂度O(N),额外空间复杂度O(1)

解析:
1.用容器:创建一个hashMap,key为原节点的值,value为克隆的节点(包含原来节点的value),
1.1将克隆的节点的next指针指向原来节点的get(原来节点.next.value),同理完成random的指向
2.用仅有的几个变量,新建原有节点的数等同的节点。
2.1将原来节点的next指向新节点
2.2将新节点的next指向原节点的next.next
2.3将原节点与新节点解开

给定两个可能有环也可能无环的单链表,头节点head1和head2。请实现一个函数,如果两个链表相交,请返回相交的 第一个节点。如果不相交,返回null

【要求】
如果两个链表长度之和为N,时间复杂度请达到O(N),额外空间复杂度 请达到O(1)。
解析:分为三种情况:
1.head1和head2都为直链,如果相交,head1和head2最后一个Node必相同
2.head1和head2都有环分为三种情况:
2.1head1和head2都是单独的两个环,不可能相交
2.2head1和head2在进环之前相交
2.3head1和head2在环中相交
3.head1和head2中有一个有环,不可能相交

能不能不给单链表的头节点,只给想要删除的节点,就能做到在链表上把这个点删掉?

解析:将删除节点的下一个节点的值和next节点复制到当前节点,删掉下一个节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值