笔试中相关单链表考题
作者:互联网
反转单链表
就是将单链表反转一下:
第一种解法:三指针。
分别是newp:被指向的指针;cur:反转指向的指针;p:下一个指针;
由图可以看出这是一次反转指针的具体操作,之后是相同的步骤以此类推,直到cur的指针为空的情况,如果链表为空或者只有一个结点,则直接返回,不进行任何操作;
第二种解法:
新建一个空链表,将原链表的结点利用头插法的思想依次头插到新链表中,最终将链表反转;
直接上图:
和上面一样也是三个指针,但代表的含义不一样,newhead:是新链表的指针,cur:即将头插的指针,p:下一个指针;按照上述步骤以此类推,完成了反转,这两种解法的核心代码是一样的,但其代表的含义不一样!
2.求链表的中间结点:
给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
第一种方法:直接统计链表的个数;利用循环将指针移动到二分之一处,循环结束后指针的指向即为链表的中间结点。
这里代码比较简单我就不写了(感兴趣的可以自行实现)。
第二种方法:
使用快慢指针:思想:fast:每次走两步,slow:每次走一步,当fast走完整个链表时,slow正好走到中间;直接上图:
代码如下所示:
3.获取单链表中倒数第k个节点。
第一种解法:将链表逆置,获取正数第k个结点,在将链表逆置(有兴趣的同学可以自行实现);
第二种解法:拿出两个指针,fast:先走k步,n为结点总个数;slow指向头指针;之后再一起走。下图所示:
代码如下:
4.链表的回文结构
如图:1->2->2->1
1:找到中间结点;2:断开,后半段逆置;3;依次对比链表中的结点是否相等。
代码如下:
5.相交链表:编写一个程序,找到两个单链表相交的起始节点。
首先判断两个链表是否相交,相交的情况:
如果相交求相交起始节点:
1,获取两个链表节点的个数;2,求其个数差值,然后让长链表走差值步数;3,两个链表一起走,直至遇到第一个相交结点。
标签:结点,单链,笔试,相交,链表,考题,解法,指针 来源: https://blog.51cto.com/u_15152976/2778123