简单问题集合

1.判断一个单链表是否有环,若是单链表有环,找出环的入口节点,计算环的长度函数

  [1]判断是否有环:指针

    第一种方法:用两个快慢指针,一个指针一次走一步,另外一个指针一次走两步,若是存在环,则这两个指针会在环内相遇。blog

    第二种方法:遍历链表时,记录节点的地址,每次访问一个节点,查找地址集合,若是找到表示有环。可使用map,把地址做为key,访问次数做为value。编译器

  [2]环的入口点和环的长度:编译

    继续用上面的快慢指针方法,设起点到环的起点距离为a,环起点到两个指针的交点距离为b,环的长度为r,慢指针走了s步,则快指针走了2s步,则:遍历

      a + b = smap

      a + b + r = 2s方法

    推导出r == s,a == r - b,所以在起点和交点设置两个指针,开始遍历,则一定相遇在环的起点位置,而且此时r == s,所以慢指针走的距离就是环的长度。im

    

 2.判断两个单链表是否相交链表

  第一种方法:把两个链表遍历后,每一个节点地址分别放到两个栈里面,比较栈顶的元素是否相同,若是相同表示相交。

  第二种方法:把问题转换为单链表是否有环的问题,即先遍历第一个链表到尾部,而后将尾部指向第二个链表的头部,而后从第二个链表开始用两个快慢指针遍历,判断是否有环,有环则表示相交。

        这里注意的是链接第二个链表后,理论应该从第一个链表头部使用快慢指针判断是否有环,可是其实不用,实际能够从链表的任意的地方开始使用快慢指针遍历判断是否有环。

        

3.反转单链表

  第一种方法:设置一个新链表头new_head = NULL,而后把以前的链表从头遍历插入到新链表上。由于从旧链表头部遍历,而且在新链表头部插入,因此完成后即是反转。

  第二种方法:设置两个指针,prev和next,prev记录节点以前的位置(由于头节点以前是NULL,因此prev初始为NULL),next记录节点以后的位置。这样遍历链表时,能够放心的摘除节点,而后重置该节点的先后指针,遍历执行即可以完成反转。

4.inline关键字

  首先头文件中不但能够包含inline函数,能够包含普通函数。

  inline发生在编译阶段,相似宏展开。inline只是给编译器的建议,若是函数体过于复杂,编译器也是会忽略的。

  好处就是省掉了入栈和出栈操做,执行速度更快。

相关文章
相关标签/搜索