转帖:关于链表操作不得不看的经典问题

本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/68462

下面是几个关于链表的非常经典的问题与实现,是在《程序员面试攻略》中看到的,由于实在是太经典了,所以忍不住在这里贴下。

    问题1:给定一个单项链表,设计一个时间优化并且时间优化的算法,找出该链表的倒数第m个元素。当m=0时,返回链表的最后一个元素。
    [分析:用双指针来实现,两指针间隔m。同步移动两指针,当前一个指针为该链表tail时,后一个指针就为要找的元素]
    问题2:从一个标准的双向链表开始。假定除了next指针和previous指针之外,每个元素保存了一个child指针,它可能指向一个独立的双向链表,也可能为空。这些子链表又可能有一个或多个子链表,如此下去,得到了一个多层次的数据结构。将这个链表展平,使得所有节点都出现在一个一层的双向链表中。每个节点定义如下:
   [分析:从第一层链表头开始遍历链表,如果有第二层链表,则将其放到第一层链表尾。这样其实第一层链表尾一直在往后移动,原来的第一层在遍历完后就可以直接遍历第二层了,依此类推就可以完成题目要求,前提要有一个指向尾指针的指针]
  问题3:编写一个函数,接受链表的头指针作为参数,确定该链表是循环的还是非循环的。如果链表是非循环的,函数返回false;如果是循环的,函数返回true。不能以任何方式修改该链表。
    [分析:用双指针实现,一个用step=1前进,一个用step=2前进。看两个指针是否能相遇]
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值