zoukankan      html  css  js  c++  java
  • hackerrank 和 leetcode的链表相关的题目的总结

    1.给出一个单链表的head,要求从反向输出链表的数据

    我是遍历一遍,用vector保存data,再反向输出

    但是,递归是更好的方式

    2.给一个单链表的head,要反转链表并返回新head

    递归,也可以写成循环的模式

    3.对边界情况考虑不够

    对指针不熟

    4.给出2个链表A,B,在某处相交,求交点处的data

    我是2重循环直接写,显然是很差的做法

    更好的做法,把A的节点的next=NULL,再遍历一遍B,此时B的终点就是交点

    5.一个链接,别人的总结:

    http://wuchong.me/blog/2014/03/25/interview-link-questions/

    6.给出一个单向链表,输出该链表中倒数第k个,链表的倒数第0个节点为链表的尾指针

    我的做法:先遍历一遍,得到链表的节点数,就得到了是正数第多少个,然后再遍历一遍

    更好的做法:设置2个指针p1,p2,首先p1,p2都指向head,然后p2向前走k步,这样p1,p2之间就隔了k个,然后p1,p2同时向前走,直到p2到达链表末尾,这时候p1就是了

    7.求链表的中间节点

    如果链表的节点个数为偶数,则返回中间2个的任意一个

    要求只能扫描一遍链表

    和第6一样的思路,设置2个指针p1,p2,然后一个每次移动2步,一个每次只移动一步

    8.判断单链表是否存在环

    这个做法很巧妙,设置2个指针,从head出发,一个每次移动一步,一个每次移动2步,2个指针移动速度不一样,如果存在环,2个指针会在环里相遇。

    如果有环的话,要找环的入口点?

    确定有环后,让p2回到head,然后继续和p1同时走,不过这次每次都是走1步,则当p1,p2再次相遇的时候,就是环路的入口了

    假设head到环的入口的距离为a,p1和p2交点与环入口点的距离为b,环的周长为l,当p1,p2第一次相遇的时候,假设p1走了n步,则有:

    a + b  = n

    a + b + k * l = 2 * n

    则k * l = a + b = n,那么从相遇点开始,p1再走n步的话,还可以回到相遇点,同时p2从头开始走,经过n步,也会到达相遇点

    在这个过程中p1,p2只有前a步走的路径不同,所以当p1和p2再次重合的时候,就是在链表的环的入口点

    9.在链表的问题中,设置2个指针是很常见的解题思路。

  • 相关阅读:
    创建数据库表
    Pod Preset玩转K8S容器时区自动配置
    CentOS7 CPU 降频问题
    Kafka Offset Monitor页面显示空白
    zabbix监控kafka消费
    istio-禁用/允许sidecar设置
    Istio 1.1部署实践
    etcd磁盘清理步骤
    Kubernetes 集群中使用 Helm 搭建 Spinnaker
    利用Spinnaker创建持续交付流水线
  • 原文地址:https://www.cnblogs.com/-maybe/p/6568363.html
Copyright © 2011-2022 走看看